package reference import ( "embed" "encoding/json" "errors" "os" "path/filepath" "strings" ) //go:embed data/*.json var bundled embed.FS var ErrNotFound = errors.New("reference data not found") type Service struct { overrideRoot string } func NewService(overrideRoot string) *Service { return &Service{overrideRoot: strings.TrimSpace(overrideRoot)} } func (s *Service) Read(kind string) (map[string]any, error) { name, ok := fileName(kind) if !ok { return nil, ErrNotFound } var data []byte var err error if s.overrideRoot != "" { data, err = os.ReadFile(filepath.Join(s.overrideRoot, "reference-data", name)) if err != nil && !errors.Is(err, os.ErrNotExist) { return nil, err } } if len(data) == 0 { data, err = bundled.ReadFile("data/" + name) if err != nil { return nil, err } } var payload map[string]any if err := json.Unmarshal(data, &payload); err != nil { return nil, err } if payload["schemaVersion"] == nil || payload["items"] == nil { return nil, errors.New("reference data schema is invalid") } return payload, nil } func (s *Service) Descriptors() map[string]any { return map[string]any{ "cpu": map[string]any{ "url": "/api/client/reference-data/cpu", "bundledFallback": true, }, "gpu": map[string]any{ "url": "/api/client/reference-data/gpu", "bundledFallback": true, }, } } func fileName(kind string) (string, bool) { switch strings.ToLower(strings.TrimSpace(kind)) { case "cpu", "cpu-ranking": return "cpu-ranking.json", true case "gpu", "gpu-ranking": return "gpu-ranking.json", true default: return "", false } }