From 2da5ca37023c2ec5cd9b3e12a2fe7caa3f6925da Mon Sep 17 00:00:00 2001 From: David Allen Date: Tue, 19 Aug 2025 21:33:58 -0600 Subject: [PATCH] feat: added jinja2 and userdata plugins --- pkg/plugin.go | 10 ++++---- pkg/plugins/jinja2.go | 55 +++++++++++++++++++++++++++++++++++------ pkg/plugins/userdata.go | 28 +++++++++++++++++++++ 3 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 pkg/plugins/userdata.go diff --git a/pkg/plugin.go b/pkg/plugin.go index d7ff3e4..b3841a7 100644 --- a/pkg/plugin.go +++ b/pkg/plugin.go @@ -1,5 +1,9 @@ package configurator +import ( + "git.towk2.me/towk/configurator/pkg/storage" +) + type Plugin interface { Name() string Version() string @@ -7,10 +11,6 @@ type Plugin interface { Metadata() map[string]string Init() error - Run(args []string) error + Run(data storage.KVStore, args []string) error Cleanup() error } - -func RunPlugin() { - -} diff --git a/pkg/plugins/jinja2.go b/pkg/plugins/jinja2.go index 9cb515d..ffbbd77 100644 --- a/pkg/plugins/jinja2.go +++ b/pkg/plugins/jinja2.go @@ -1,19 +1,58 @@ package plugin +import ( + "bytes" + + "git.towk2.me/towk/configurator/pkg/storage" + "github.com/nikolalohinski/gonja/v2" + "github.com/nikolalohinski/gonja/v2/exec" +) + type Jinja2 struct{} -func Name() string { return "jinja2" } -func Version() string { return "test" } -func Description() string { return "Renders Jinja 2 templates" } -func Metadata() map[string]string { +func (p *Jinja2) Name() string { return "jinja2" } +func (p *Jinja2) Version() string { return "test" } +func (p *Jinja2) Description() string { return "Renders Jinja 2 templates" } +func (p *Jinja2) Metadata() map[string]string { return map[string]string{ "author.name": "David J. Allen", "author.email": "davidallendj@gmail.com", } } -func Init() { - // initialize Jinja2 (gonja) +func (p *Jinja2) Init() error { + // nothing to initialize + return nil +} + +func (p *Jinja2) Run(data storage.KVStore, args []string) error { + // render the files using Jinja 2 from args + newContent := []string{} + for _, arg := range args { + var ( + context *exec.Context + template *exec.Template + output bytes.Buffer + err error + ) + template, err = gonja.FromString(arg) + if err != nil { + panic(err) + } + + context = exec.NewContext(data.GetData().(map[string]any)) + if err = template.Execute(&output, context); err != nil { // Prints: Hello Bob! + panic(err) + } + newContent = append(newContent, output.String()) + } + + // write back to the data storage + data.Set("out", newContent) + return nil +} + +func (p *Jinja2) Cleanup() error { + // nothing to clean up + return nil } -func Run() {} -func Cleanup() {} diff --git a/pkg/plugins/userdata.go b/pkg/plugins/userdata.go new file mode 100644 index 0000000..4b274b9 --- /dev/null +++ b/pkg/plugins/userdata.go @@ -0,0 +1,28 @@ +package plugin + +import "git.towk2.me/towk/configurator/pkg/storage" + +type UserData struct{} + +func (p *UserData) Name() string { return "jinja2" } +func (p *UserData) Version() string { return "test" } +func (p *UserData) Description() string { return "Renders Jinja 2 templates" } +func (p *UserData) Metadata() map[string]string { + return map[string]string{ + "author.name": "David J. Allen", + "author.email": "davidallendj@gmail.com", + } +} + +func (p *UserData) Init() error { + // nothing to initialize + return nil +} + +func (p *UserData) Run(data storage.KVStore, args []string) error { + return nil +} + +func (p *UserData) Clean() error { + return nil +}