schema/v1/read.go (61 lines of code) (raw):
package schema
import (
"bytes"
"fmt"
"os"
"strings"
"gopkg.in/yaml.v3"
)
func LoadSteps(filename string) (*Spec, *Step, error) {
buf, err := os.ReadFile(filename)
if err != nil {
return nil, nil, fmt.Errorf("reading file: %w", err)
}
return ReadSteps(string(buf))
}
func ReadSteps(content string) (*Spec, *Step, error) {
var (
spec Spec
step Step
)
if err := unmarshalSchema(content, &spec, &step); err != nil {
return nil, nil, fmt.Errorf("unmarshaling: %w", err)
}
err := validateSpec(spec)
if err != nil {
return nil, nil, fmt.Errorf("validating spec: %w", err)
}
err = validateStep(step)
if err != nil {
return nil, nil, fmt.Errorf("validating step: %w", err)
}
return &spec, &step, nil
}
func WriteSteps(spec *Spec, step *Step) (string, error) {
var buf bytes.Buffer
e := yaml.NewEncoder(&buf)
err := e.Encode(spec)
if err != nil {
return "", fmt.Errorf("encoding spec: %w", err)
}
err = e.Encode(step)
if err != nil {
return "", fmt.Errorf("encoding definition: %w", err)
}
err = e.Close()
if err != nil {
return "", fmt.Errorf("closing: %w", err)
}
return buf.String(), nil
}
func unmarshalSchema(input string, subjects ...any) error {
d := yaml.NewDecoder(strings.NewReader(input))
d.KnownFields(true)
for _, subject := range subjects {
err := d.Decode(subject)
if err != nil {
return fmt.Errorf("decoding: %w", err)
}
}
return nil
}