package object import ( "fmt" "os" "path/filepath" "strings" "gopkg.in/yaml.v3" ) type ItemStore struct { dataDir string cache map[string]*ItemDef } func NewItemStore(dataDir string) *ItemStore { return &ItemStore{ dataDir: dataDir, cache: make(map[string]*ItemDef), } } func (s *ItemStore) Load(id string) (*ItemDef, error) { if def, ok := s.cache[id]; ok { return def, nil } path := filepath.Join(s.dataDir, "items", id+".yaml") data, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("read item %s: %w", id, err) } var def ItemDef if err := yaml.Unmarshal(data, &def); err != nil { return nil, fmt.Errorf("parse item %s: %w", id, err) } s.cache[id] = &def return &def, nil } func (s *ItemStore) LoadAll() ([]*ItemDef, error) { dir := filepath.Join(s.dataDir, "items") entries, err := os.ReadDir(dir) if err != nil { return nil, err } var defs []*ItemDef for _, e := range entries { if e.IsDir() || filepath.Ext(e.Name()) != ".yaml" { continue } id := strings.TrimSuffix(e.Name(), ".yaml") def, err := s.Load(id) if err != nil { continue } defs = append(defs, def) } return defs, nil }