From 17bb6a383b6427983297b14fb9eb22d5db9fa078 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 7 Dec 2024 01:35:44 -0500 Subject: [PATCH] providers: Add import/include provider --- providers/all.go | 2 ++ providers/import/import.go | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 providers/import/import.go diff --git a/providers/all.go b/providers/all.go index 492eff0..003a620 100644 --- a/providers/all.go +++ b/providers/all.go @@ -4,6 +4,7 @@ import "git.tebibyte.media/sashakoshka/step" import fpos "git.tebibyte.media/sashakoshka/step/providers/os" import fphttp "git.tebibyte.media/sashakoshka/step/providers/http" import fpsprig "git.tebibyte.media/sashakoshka/step/providers/sprig" +import fpimport "git.tebibyte.media/sashakoshka/step/providers/import" import fpmarkdown "git.tebibyte.media/sashakoshka/step/providers/markdown" // All returns a slice of all providers defined in sub-packages. @@ -12,6 +13,7 @@ func All () []step.FuncProvider { new(fpos.Provider), new(fphttp.Provider), new(fpsprig.Provider), + new(fpimport.Provider), fpmarkdown.Default(), } } diff --git a/providers/import/import.go b/providers/import/import.go new file mode 100644 index 0000000..96845cf --- /dev/null +++ b/providers/import/import.go @@ -0,0 +1,46 @@ +package impor + +import "strings" +import "html/template" +import "git.tebibyte.media/sashakoshka/step" + +var _ step.FuncProviderFor = new(Provider) + +// Provider provides import functions. +type Provider struct { + +} + +// FuncMap fulfills the step.FuncProvider interface. +func (this *Provider) FuncMap () template.FuncMap { + return nil +} + +// FuncMapFor fulfills the step.FuncProviderFor interface. +func (this *Provider) FuncMapFor (document *step.Document) template.FuncMap { + stat := &state { + document: document, + } + return template.FuncMap { + "include": stat.funcInclude, + "includeHTML": stat.funcIncludeHTML, + } +} + +type state struct { + document *step.Document +} + +func (this *state) funcInclude (name string, data any) (string, error) { + document, err := this.document.Environment().Parse(name) + if err != nil { return "", err } + builder := strings.Builder { } + err = document.Execute(&builder, step.ExecutionData { Data: data }) + if err != nil { return "", err } + return builder.String(), nil +} + +func (this *state) funcIncludeHTML (name string, data any) (template.HTML, error) { + result, err := this.funcInclude(name, data) + return template.HTML(result), err +}