diff options
author | Simon Ser <contact@emersion.fr> | 2019-12-16 12:26:26 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-12-16 12:26:26 +0100 |
commit | e83844fbad63a0d6fc2d29a8a412c95f2a419b56 (patch) | |
tree | 268ac8b962442608895c8115366079fe6793c0a5 | |
parent | 90080cc8b63ac943c15995e7e2671d58a74b9994 (diff) | |
download | alps-e83844fbad63a0d6fc2d29a8a412c95f2a419b56.tar.gz alps-e83844fbad63a0d6fc2d29a8a412c95f2a419b56.zip |
Add an API for Go plugins
References: https://todo.sr.ht/~sircmpwn/koushin/39
-rw-r--r-- | plugin.go | 7 | ||||
-rw-r--r-- | plugin_go.go | 97 | ||||
-rw-r--r-- | server.go | 8 |
3 files changed, 111 insertions, 1 deletions
@@ -22,3 +22,10 @@ type Plugin interface { // Close is called when the plugin is unloaded. Close() error } + +var plugins []Plugin + +// RegisterPlugin registers a plugin to be loaded on server startup. +func RegisterPlugin(p Plugin) { + plugins = append(plugins, p) +} diff --git a/plugin_go.go b/plugin_go.go new file mode 100644 index 0000000..30858b5 --- /dev/null +++ b/plugin_go.go @@ -0,0 +1,97 @@ +package koushin + +import ( + "html/template" + "net/http" + "path/filepath" + + "github.com/labstack/echo/v4" +) + +type goPlugin struct { + p *GoPlugin +} + +func (p *goPlugin) Name() string { + return p.p.Name +} + +func (p *goPlugin) LoadTemplate(t *template.Template) error { + t.Funcs(p.p.templateFuncs) + + paths, err := filepath.Glob(pluginDir + "/" + p.p.Name + "/public/*.html") + if err != nil { + return err + } + if len(paths) > 0 { + if _, err := t.ParseFiles(paths...); err != nil { + return err + } + } + + return nil +} + +func (p *goPlugin) SetRoutes(group *echo.Group) { + for _, r := range p.p.routes { + group.Add(r.Method, r.Path, r.Handler) + } + + group.Static("/assets", pluginDir + "/" + p.p.Name + "/public/assets") +} + +func (p *goPlugin) Inject(name string, data interface{}) error { + return nil +} + +func (p *goPlugin) Close() error { + return nil +} + +type goPluginRoute struct { + Method string + Path string + Handler echo.HandlerFunc +} + +type GoPlugin struct { + Name string + + routes []goPluginRoute + + templateFuncs template.FuncMap +} + +func (p *GoPlugin) AddRoute(method, path string, handler echo.HandlerFunc) { + p.routes = append(p.routes, goPluginRoute{method, path, handler}) +} + +func (p *GoPlugin) DELETE(path string, handler echo.HandlerFunc) { + p.AddRoute(http.MethodDelete, path, handler) +} + +func (p *GoPlugin) GET(path string, handler echo.HandlerFunc) { + p.AddRoute(http.MethodGet, path, handler) +} + +func (p *GoPlugin) POST(path string, handler echo.HandlerFunc) { + p.AddRoute(http.MethodPost, path, handler) +} + +func (p *GoPlugin) PUT(path string, handler echo.HandlerFunc) { + p.AddRoute(http.MethodPut, path, handler) +} + +func (p *GoPlugin) TemplateFuncs(funcs template.FuncMap) { + if p.templateFuncs == nil { + p.templateFuncs = make(template.FuncMap, len(funcs)) + } + + for k, f := range funcs { + p.templateFuncs[k] = f + } +} + +func (p *GoPlugin) Plugin() Plugin { + return &goPlugin{p} +} @@ -137,10 +137,16 @@ func New(e *echo.Echo, options *Options) error { return err } - s.Plugins, err = loadAllLuaPlugins(e.Logger) + s.Plugins = append([]Plugin(nil), plugins...) + for _, p := range s.Plugins { + e.Logger.Printf("Registered plugin '%v'", p.Name()) + } + + luaPlugins, err := loadAllLuaPlugins(e.Logger) if err != nil { return fmt.Errorf("failed to load plugins: %v", err) } + s.Plugins = append(s.Plugins, luaPlugins...) e.Renderer, err = loadTemplates(e.Logger, options.Theme, s.Plugins) if err != nil { |