93 lines
1.7 KiB
Go
93 lines
1.7 KiB
Go
package templates
|
|
|
|
import (
|
|
"fmt"
|
|
"io/fs"
|
|
"path"
|
|
|
|
"github.com/evcc-io/evcc/templates/definition"
|
|
"golang.org/x/exp/slices"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
var (
|
|
templates = make(map[string][]Template)
|
|
configDefaults = ConfigDefaults{}
|
|
)
|
|
|
|
const (
|
|
Charger = "charger"
|
|
Meter = "meter"
|
|
Vehicle = "vehicle"
|
|
)
|
|
|
|
func loadTemplates(class string) {
|
|
configDefaults.LoadDefaults()
|
|
|
|
if templates[class] != nil {
|
|
return
|
|
}
|
|
|
|
err := fs.WalkDir(definition.YamlTemplates, ".", func(filepath string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if d.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
b, err := fs.ReadFile(definition.YamlTemplates, filepath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var definition TemplateDefinition
|
|
if err = yaml.Unmarshal(b, &definition); err != nil {
|
|
return fmt.Errorf("reading template '%s' failed: %w", filepath, err)
|
|
}
|
|
|
|
tmpl := Template{
|
|
TemplateDefinition: definition,
|
|
ConfigDefaults: configDefaults,
|
|
}
|
|
if err = tmpl.ResolvePresets(); err != nil {
|
|
return err
|
|
}
|
|
if err = tmpl.ResolveGroup(); err != nil {
|
|
return err
|
|
}
|
|
if err = tmpl.UpdateParamsWithDefaults(); err != nil {
|
|
return err
|
|
}
|
|
if err = tmpl.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
path := path.Dir(filepath)
|
|
templates[path] = append(templates[path], tmpl)
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func ByClass(class string) []Template {
|
|
loadTemplates(class)
|
|
|
|
return templates[class]
|
|
}
|
|
|
|
func ByName(name, class string) (Template, error) {
|
|
loadTemplates(class)
|
|
|
|
for _, tmpl := range templates[class] {
|
|
if tmpl.Template == name || slices.Contains(tmpl.Covers, name) {
|
|
return tmpl, nil
|
|
}
|
|
}
|
|
|
|
return Template{}, fmt.Errorf("template not found: %s", name)
|
|
}
|