ソースを参照

Introduce PluginLoaderFunc

This allows registered plugins to execute code when loaded. This will
also allow the Lua support code to be a plugin.

Closes: https://todo.sr.ht/~sircmpwn/koushin/54
master
Simon Ser 4年前
コミット
01983eb7b5
この署名に対応する既知のキーがデータベースに存在しません GPGキーID: FDE7BE0E88F5E48
4個のファイルの変更26行の追加8行の削除
  1. +8
    -4
      plugin.go
  2. +7
    -0
      plugin_go.go
  3. +1
    -1
      plugins/base/plugin.go
  4. +10
    -3
      server.go

+ 8
- 4
plugin.go ファイルの表示

@@ -23,9 +23,13 @@ type Plugin interface {
Close() error Close() error
} }


var plugins []Plugin
// PluginLoaderFunc loads plugins for the provided server.
type PluginLoaderFunc func(*Server) ([]Plugin, error)


// RegisterPlugin registers a plugin to be loaded on server startup.
func RegisterPlugin(p Plugin) {
plugins = append(plugins, p)
var pluginLoaders []PluginLoaderFunc

// RegisterPluginLoader registers a plugin loader. The loader will be called on
// server start-up and reload.
func RegisterPluginLoader(f PluginLoaderFunc) {
pluginLoaders = append(pluginLoaders, f)
} }

+ 7
- 0
plugin_go.go ファイルの表示

@@ -132,3 +132,10 @@ func (p *GoPlugin) Inject(name string, f InjectFunc) {
func (p *GoPlugin) Plugin() Plugin { func (p *GoPlugin) Plugin() Plugin {
return &goPlugin{p} return &goPlugin{p}
} }

// Loader returns a loader function for this plugin.
func (p *GoPlugin) Loader() PluginLoaderFunc {
return func(*Server) ([]Plugin, error) {
return []Plugin{p.Plugin()}, nil
}
}

+ 1
- 1
plugins/base/plugin.go ファイルの表示

@@ -12,5 +12,5 @@ func init() {
p.TemplateFuncs(templateFuncs) p.TemplateFuncs(templateFuncs)
registerRoutes(&p) registerRoutes(&p)


koushin.RegisterPlugin(p.Plugin())
koushin.RegisterPluginLoader(p.Loader())
} }

+ 10
- 3
server.go ファイルの表示

@@ -176,9 +176,16 @@ func (s *Server) parseSMTPUpstream() error {
} }


func (s *Server) load() error { func (s *Server) load() error {
plugins := append([]Plugin(nil), plugins...)
for _, p := range plugins {
s.e.Logger.Printf("Registered plugin '%v'", p.Name())
var plugins []Plugin
for _, load := range pluginLoaders {
l, err := load(s)
if err != nil {
return fmt.Errorf("failed to load plugins: %v", err)
}
for _, p := range l {
s.e.Logger.Printf("Loaded plugin %q", p.Name())
}
plugins = append(plugins, l...)
} }


luaPlugins, err := loadAllLuaPlugins(s.e.Logger) luaPlugins, err := loadAllLuaPlugins(s.e.Logger)


読み込み中…
キャンセル
保存