package impor import "fmt" import "errors" 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 { "panic": stat.funcPanic, "execute": stat.funcExecute, "include": stat.funcInclude, "includeHTML": stat.funcIncludeHTML, } } type state struct { document *step.Document } func (this *state) funcPanic (message any) (string, error) { if err, ok := message.(error); ok { return "", err } else { return "", errors.New(fmt.Sprint(message)) } } func (this *state) funcExecute (name string, data any) (step.ExecutionResult, error) { name, err := this.document.Rel(name) if err != nil { return step.ExecutionResult { }, err } document, err := this.document.Environment().Parse(name) if err != nil { return step.ExecutionResult { }, err } builder := strings.Builder { } err = document.Execute(&builder, step.ExecutionData { Data: data }) if err != nil { return step.ExecutionResult { }, err } return step.ExecutionResult { Author: document.Author, Title: document.Title, Extends: document.Extends, Meta: document.Meta, Body: template.HTML(builder.String()), }, nil } func (this *state) funcInclude (name string, data any) (string, error) { result, err := this.funcIncludeHTML(name, data) return string(result), err } func (this *state) funcIncludeHTML (name string, data any) (template.HTML, error) { result, err := this.funcExecute(name, data) if err != nil { return "", err } return result.Body, nil }