aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugin.go7
-rw-r--r--plugin_go.go97
-rw-r--r--server.go8
3 files changed, 111 insertions, 1 deletions
diff --git a/plugin.go b/plugin.go
index aa964ec..46fd1a7 100644
--- a/plugin.go
+++ b/plugin.go
@@ -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}
+}
diff --git a/server.go b/server.go
index 171ba53..98b5fb2 100644
--- a/server.go
+++ b/server.go
@@ -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 {