package main import ( "fmt" "github.com/davecgh/go-spew/spew" ) type PluginRegistry struct { CorePlugin map[string]CoreInterface HandlerPlugin map[string]HandlerInterface } func NewPluginRegistry() *PluginRegistry { r := new(PluginRegistry) r.CorePlugin = make(map[string]CoreInterface) r.HandlerPlugin = make(map[string]HandlerInterface) return r } func (r *PluginRegistry) RegisterCorePlugin(plugin CoreInterface) error { spew.Dump(plugin) name, e := plugin.Register() if e != nil { return e } r.CorePlugin[name] = plugin return nil } func (r *PluginRegistry) RegisterHandlerPlugin(plugin HandlerInterface) error { name, e := plugin.Register() if e != nil { return e } r.HandlerPlugin[name] = plugin return nil } func (r *PluginRegistry) GetCorePlugin(name string) CoreInterface { return r.CorePlugin[name] } func (r *PluginRegistry) GetHandlerPlugin(name string) HandlerInterface { return r.HandlerPlugin[name] } func (r *PluginRegistry) RemoveCorePlugin(name string) { delete(r.CorePlugin, name) } func (r *PluginRegistry) RemoveHandlerPlugin(name string) { delete(r.HandlerPlugin, name) } func (r *PluginRegistry) Run() error { for _, v := range r.CorePlugin { if e := v.BeforeRun(); e != nil { return e } } for _, v := range r.CorePlugin { if e := v.Run(); e != nil { return e } } for _, v := range r.CorePlugin { if e := v.AfterRun(); e != nil { return e } } return nil } func (r *PluginRegistry) Shutdown() { fmt.Println("Registry: Shutdown") spew.Dump(r.CorePlugin) for k, v := range r.CorePlugin { fmt.Println(k, v) if e := v.UnRegister(); e != nil { panic(e) } } fmt.Println("Registry: Shutdown Done") }