package storage import ( "fmt" "io/fs" "os" "git.wtrh.nl/patterns/gopatterns/pkg/config" "git.wtrh.nl/patterns/gopatterns/pkg/dimensions" "git.wtrh.nl/patterns/gopatterns/pkg/template" "gopkg.in/yaml.v3" ) 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) LoadDimensions(sizes config.Sizes) (dimensions.Dimensions, error) { f, err := s.dir.Open("dimension_names.yaml") if err != nil { return nil, fmt.Errorf("open \"dimension_names.yaml\": %w", err) } namedDimensions := dimensions.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 } // LoadTemplate reads and decodes a [Template] from a yaml file. func (s Storage) LoadTemplate(name string) (template.Template, error) { fh, err := s.dir.Open(name + ".yaml") if err != nil { return template.Template{}, fmt.Errorf("open template file %q: %w", name, err) } t := template.Template{} err = yaml.NewDecoder(fh).Decode(&t) if err != nil { return template.Template{}, fmt.Errorf("decode content of file %q as yaml: %w", name, err) } return t, nil }