87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package template
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"go.yaml.in/yaml/v4"
|
|
)
|
|
|
|
type yamlBlock struct {
|
|
Path string `yaml:"path"`
|
|
Codec string `yaml:"codec"`
|
|
Value any `yaml:"value,omitempty"`
|
|
Fields []yamlField `yaml:"fields"`
|
|
ListTemplate string `yaml:"listTemplate,omitempty"`
|
|
Hidden bool `yaml:"hidden,omitempty"`
|
|
PathAlias []string `yaml:"pathAlias,omitempty"`
|
|
}
|
|
|
|
type yamlField struct {
|
|
Path string `yaml:"path"`
|
|
Value any `yaml:"value,omitempty"`
|
|
Codec string `yaml:"codec"`
|
|
Hidden bool `yaml:"hidden,omitempty"`
|
|
PathAlias []string `yaml:"pathAlias,omitempty"`
|
|
}
|
|
|
|
func parseYamlTemplate(input string) (block Block, err error) {
|
|
var blk yamlBlock
|
|
|
|
cleaned := cleanTemplate(input)
|
|
|
|
dec := yaml.NewDecoder(strings.NewReader(cleaned))
|
|
dec.KnownFields(true)
|
|
|
|
if err := dec.Decode(&blk); err != nil {
|
|
return block, fmt.Errorf("content '%q': %w", cleaned, err)
|
|
}
|
|
|
|
if blk.Path == "" {
|
|
return block, fmt.Errorf("missing top-level 'path'")
|
|
}
|
|
|
|
if blk.Codec == "" {
|
|
blk.Codec = "text"
|
|
}
|
|
|
|
codec, err := parseCodecType(blk.Codec)
|
|
if err != nil {
|
|
return block, fmt.Errorf("failed to parse codec: %w", err)
|
|
}
|
|
|
|
var fields []BlockField
|
|
|
|
for _, field := range blk.Fields {
|
|
if field.Path == "" {
|
|
return block, fmt.Errorf("failed to parse field: %v", field)
|
|
}
|
|
|
|
if field.Codec == "" {
|
|
field.Codec = "text"
|
|
}
|
|
|
|
fieldCodec, err := parseCodecType(field.Codec)
|
|
if err != nil {
|
|
return block, fmt.Errorf("failed to parse codec: %w", err)
|
|
}
|
|
|
|
fields = append(fields, BlockField{
|
|
Path: field.Path,
|
|
CodecType: fieldCodec,
|
|
Value: field.Value,
|
|
Hidden: field.Hidden,
|
|
})
|
|
|
|
}
|
|
|
|
return Block{
|
|
Type: DataBlock,
|
|
Path: blk.Path,
|
|
Codec: codec,
|
|
Fields: fields,
|
|
ListTemplate: blk.ListTemplate,
|
|
content: input,
|
|
}, nil
|
|
}
|