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 }