Files
YMhut-box-C-/server/unified-management/internal/reference/reference.go
T

77 lines
1.6 KiB
Go

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
}
}