1 /**
2 Copyright: Copyright (c) 2015-2018 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 
7 module pluginlib.pluginregistry;
8 
9 import voxelman.log;
10 import std.exception;
11 import pluginlib;
12 
13 /// register plugins here inside shared static this
14 __gshared PluginRegistry pluginRegistry;
15 
16 alias ClientMain = void delegate(string[] args);
17 alias ServerMain = void delegate(string[] args, ServerMode);
18 
19 enum ServerMode
20 {
21 	standalone,
22 	internal
23 }
24 
25 struct PluginRegistry
26 {
27 	void regClientPlugin(P : IPlugin)(P plug)
28 	{
29 		enforce(plug, "null plugin instance");
30 		errorf(!!(typeid(plug) in clientPlugins),
31 			"%s is already registered as client plugin", plug.id);
32 		clientPlugins[typeid(plug)] = plug;
33 	}
34 	void regServerPlugin(P : IPlugin)(P plug)
35 	{
36 		enforce(plug, "null plugin instance");
37 		errorf(!!(typeid(plug) in serverPlugins),
38 			"%s is already registered as server plugin", plug.id);
39 		serverPlugins[typeid(plug)] = plug;
40 	}
41 
42 	void regClientMain(ClientMain clientMain)
43 	{
44 		this.clientMain = clientMain;
45 	}
46 	void regServerMain(ServerMain serverMain)
47 	{
48 		this.serverMain = serverMain;
49 	}
50 
51 	IPlugin[TypeInfo] clientPlugins;
52 	IPlugin[TypeInfo] serverPlugins;
53 	ClientMain clientMain;
54 	ServerMain serverMain;
55 }