package catalog import "slices" // Game describes an installed, internally published version. The registry // never imports manifests from a player request or the legacy application. type Game struct { ID string Version string Title string Summary string // DefaultLocale labels Title and Summary; Translations holds additional copies. DefaultLocale string Translations map[string]Translation MinPlayers int MaxPlayers int Published bool } type Translation struct { Title string Summary string } type Registry struct { games []Game } func NewRegistry(games []Game) *Registry { copyGames := slices.Clone(games) for i := range copyGames { copyGames[i].Translations = make(map[string]Translation, len(games[i].Translations)) for locale, copy := range games[i].Translations { copyGames[i].Translations[locale] = copy } } return &Registry{games: copyGames} } func (g Game) Text(locale string) (Translation, string) { defaultLocale := g.DefaultLocale if defaultLocale == "" { defaultLocale = "es" } if locale == defaultLocale { return Translation{Title: g.Title, Summary: g.Summary}, defaultLocale } if translation, ok := g.Translations[locale]; ok && translation.Title != "" && translation.Summary != "" { return translation, locale } return Translation{Title: g.Title, Summary: g.Summary}, defaultLocale } func (r *Registry) Published() []Game { result := make([]Game, 0) for _, game := range r.games { if game.Published { result = append(result, game) } } slices.SortFunc(result, func(a, b Game) int { if a.Title < b.Title { return -1 } if a.Title > b.Title { return 1 } if a.ID < b.ID { return -1 } if a.ID > b.ID { return 1 } return 0 }) return result }