evcc-io/util/templates/init.go
Andreas Linde bfb61c4965
Various template improvements (#2119)
- Remove unused port param in senec-home template
- Support for multiple predefined param sets, also adds identifier params to Tesla, Tronity, OVMS, ...
- Properly handle optional number/float checks
- Add Dacia vehicle template
2021-12-26 17:33:32 +01:00

78 lines
1.3 KiB
Go

package templates
import (
"fmt"
"io/fs"
"path"
"github.com/evcc-io/evcc/templates/definition"
"gopkg.in/yaml.v3"
)
var (
templates = make(map[string][]Template)
)
const (
Charger = "charger"
Meter = "meter"
Vehicle = "vehicle"
)
func loadTemplates(class string) {
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 tmpl Template
if err = yaml.Unmarshal(b, &tmpl); err != nil {
return fmt.Errorf("reading template '%s' failed: %w", filepath, err)
}
if err = tmpl.ResolveParamBases(); 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 ByTemplate(t, class string) (Template, error) {
loadTemplates(class)
for _, tmpl := range templates[class] {
if tmpl.Template == t {
return tmpl, nil
}
}
return Template{}, fmt.Errorf("template not found: %s", t)
}