Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

70 wiersze
1.5KB

  1. package storage
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "git.wtrh.nl/patterns/gopatterns/pkg/config"
  7. "git.wtrh.nl/patterns/gopatterns/pkg/dimensions"
  8. "git.wtrh.nl/patterns/gopatterns/pkg/template"
  9. "gopkg.in/yaml.v3"
  10. )
  11. type Storage struct {
  12. dir fs.FS
  13. }
  14. func NewStorage(dir string) (Storage, error) {
  15. _, err := os.Stat(dir)
  16. if err != nil {
  17. return Storage{}, err
  18. }
  19. return Storage{dir: os.DirFS(dir)}, nil
  20. }
  21. func (s Storage) LoadDimensions(sizes config.Sizes) (dimensions.Dimensions, error) {
  22. f, err := s.dir.Open("dimension_names.yaml")
  23. if err != nil {
  24. return nil, fmt.Errorf("open \"dimension_names.yaml\": %w", err)
  25. }
  26. namedDimensions := dimensions.Dimensions{}
  27. err = yaml.NewDecoder(f).Decode(&namedDimensions)
  28. if err != nil {
  29. return nil, fmt.Errorf("decode yaml from \"dimension_names.yaml\": %w", err)
  30. }
  31. for id, dimension := range namedDimensions {
  32. size, ok := sizes[string(id)]
  33. if !ok {
  34. delete(namedDimensions, id)
  35. continue
  36. }
  37. dimension.Value = size
  38. namedDimensions[id] = dimension
  39. }
  40. return namedDimensions, nil
  41. }
  42. // LoadTemplate reads and decodes a [Template] from a yaml file.
  43. func (s Storage) LoadTemplate(name string) (template.Template, error) {
  44. fh, err := s.dir.Open(name + ".yaml")
  45. if err != nil {
  46. return template.Template{}, fmt.Errorf("open template file %q: %w", name, err)
  47. }
  48. t := template.Template{}
  49. err = yaml.NewDecoder(fh).Decode(&t)
  50. if err != nil {
  51. return template.Template{}, fmt.Errorf("decode content of file %q as yaml: %w", name, err)
  52. }
  53. return t, nil
  54. }