Add Provider interface
This commit is contained in:
parent
952ce8f184
commit
433a112875
@ -76,7 +76,7 @@ func main () {
|
||||
|
||||
// set up the environment
|
||||
environment := step.Environment { }
|
||||
environment.FuncProviders = providers.All()
|
||||
environment.Providers = providers.All()
|
||||
err = environment.Init(context.Background())
|
||||
if err != nil { log.Fatal(err) }
|
||||
|
||||
|
@ -19,9 +19,10 @@ type Environment struct {
|
||||
// FS, if specified, is the filesystem that this environment will load
|
||||
// documents from. Its methods must be safe for concurrent execution.
|
||||
FS fs.FS
|
||||
// FuncProviders is a slice of FuncMap providers whoose functions will
|
||||
// be available to any documents this environment processes.
|
||||
FuncProviders []FuncProvider
|
||||
// Providers is a slice of objects which can provide various
|
||||
// functionality to the environment. In order to be used, values in this
|
||||
// slice must implement one or more of the interfaces in provider.go.
|
||||
Providers []Provider
|
||||
|
||||
documents usync.Locker[map[string] *Document]
|
||||
funcMap template.FuncMap
|
||||
@ -31,7 +32,9 @@ type Environment struct {
|
||||
func (this *Environment) Init (ctx context.Context) error {
|
||||
this.documents = usync.NewLocker(make(map[string] *Document))
|
||||
this.funcMap = make(template.FuncMap)
|
||||
for _, provider := range this.FuncProviders {
|
||||
for _, provider := range this.Providers {
|
||||
provider, ok := provider.(FuncProvider)
|
||||
if !ok { continue }
|
||||
funcMap := provider.FuncMap()
|
||||
if funcMap == nil { continue }
|
||||
for name, function := range funcMap {
|
||||
@ -127,7 +130,7 @@ func (this *Environment) parse (name string, modTime time.Time, input io.Reader)
|
||||
for name, function := range this.funcMap {
|
||||
funcMap[name] = function
|
||||
}
|
||||
for _, provider := range this.FuncProviders {
|
||||
for _, provider := range this.Providers {
|
||||
provider, ok := provider.(FuncProviderFor)
|
||||
if !ok { continue }
|
||||
funcMapFor := provider.FuncMapFor(document)
|
||||
|
@ -2,8 +2,12 @@ package step
|
||||
|
||||
import "html/template"
|
||||
|
||||
// Provider is an object which provides extra functionality to an environment.
|
||||
type Provider any
|
||||
|
||||
// FuncProvider provides a template.FuncMap.
|
||||
type FuncProvider interface {
|
||||
Provider
|
||||
// FuncMap provides a template.FuncMap. It may return nil, in which case
|
||||
// its result is simply not considered.
|
||||
FuncMap () template.FuncMap
|
||||
@ -12,7 +16,7 @@ type FuncProvider interface {
|
||||
// FuncProviderFor is an object that provides a template.FuncMap for a specific
|
||||
// document.
|
||||
type FuncProviderFor interface {
|
||||
FuncProvider
|
||||
Provider
|
||||
// FuncMap provides a template.FuncMap, given a particular document. It
|
||||
// may return nil, in which case its result is simply not considered.
|
||||
FuncMapFor (*Document) template.FuncMap
|
||||
@ -20,6 +24,7 @@ type FuncProviderFor interface {
|
||||
|
||||
// Configurable is an object that can be configured according to metadata.
|
||||
type Configurable interface {
|
||||
Provider
|
||||
// Configure uses config to configure the object. It must not modify
|
||||
// config. Keys are namespaced with a '.' and are written in kebab case.
|
||||
Configure (config Meta) error
|
||||
|
@ -1,6 +1,6 @@
|
||||
package providers
|
||||
|
||||
import "git.tebibyte.media/sashakoshka/step"
|
||||
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 fppath "git.tebibyte.media/sashakoshka/step/providers/path"
|
||||
@ -11,8 +11,8 @@ 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.
|
||||
func All () []step.FuncProvider {
|
||||
return []step.FuncProvider {
|
||||
func All () []step.Provider {
|
||||
return []step.Provider {
|
||||
new(fpos.Provider),
|
||||
new(fphttp.Provider),
|
||||
new(fppath.Provider),
|
||||
|
Loading…
Reference in New Issue
Block a user