package template import ( "fmt" "git.wtrh.nl/wouter/gopatterns/pkg/pattern" "gopkg.in/yaml.v3" "io/fs" "os" ) type Storage struct { dir fs.FS } func NewStorage(dir string) (Storage, error) { _, err := os.Stat(dir) if err != nil { return Storage{}, err } return Storage{dir: os.DirFS(dir)}, nil } func (s Storage) Dimensions(sizes Sizes) (pattern.Dimensions, error) { f, err := s.dir.Open("dimension_names.yaml") if err != nil { return nil, fmt.Errorf("open \"dimension_names.yaml\": %w", err) } namedDimensions := pattern.Dimensions{} err = yaml.NewDecoder(f).Decode(&namedDimensions) if err != nil { return nil, fmt.Errorf("decode yaml from \"dimension_names.yaml\": %w", err) } for id, dimension := range namedDimensions { size, ok := sizes[string(id)] if !ok { delete(namedDimensions, id) continue } dimension.Value = size namedDimensions[id] = dimension } return namedDimensions, nil } // Request contains the information to draw a pattern for a specific owner, with corresponding // sizes and the template name. type Request struct { Sizes Sizes `yaml:"sizes,omitempty"` Owner string `yaml:"owner"` Template string `yaml:"template,omitempty"` } // LoadTemplate reads and decodes a [Template] from a yaml file. func (s Storage) LoadTemplate(name string) (Template, error) { fh, err := s.dir.Open(name + ".yaml") if err != nil { return Template{}, fmt.Errorf("open template file %q: %w", name, err) } template := Template{} err = yaml.NewDecoder(fh).Decode(&template) if err != nil { return Template{}, fmt.Errorf("decode content of file %q as yaml: %w", name, err) } return template, nil }