68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
|
|
package marketplace
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Module is a marketplace entry pointing to a module's Git repo.
|
||
|
|
type Module struct {
|
||
|
|
Code string `json:"code"`
|
||
|
|
Name string `json:"name"`
|
||
|
|
Repo string `json:"repo"`
|
||
|
|
SignKey string `json:"sign_key"`
|
||
|
|
Category string `json:"category"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// Index is the root marketplace catalog.
|
||
|
|
type Index struct {
|
||
|
|
Version int `json:"version"`
|
||
|
|
Modules []Module `json:"modules"`
|
||
|
|
Categories []string `json:"categories"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ParseIndex decodes a marketplace index.json.
|
||
|
|
func ParseIndex(data []byte) (*Index, error) {
|
||
|
|
var idx Index
|
||
|
|
if err := json.Unmarshal(data, &idx); err != nil {
|
||
|
|
return nil, fmt.Errorf("marketplace.ParseIndex: %w", err)
|
||
|
|
}
|
||
|
|
return &idx, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Search returns modules matching the query in code, name, or category.
|
||
|
|
func (idx *Index) Search(query string) []Module {
|
||
|
|
q := strings.ToLower(query)
|
||
|
|
var results []Module
|
||
|
|
for _, m := range idx.Modules {
|
||
|
|
if strings.Contains(strings.ToLower(m.Code), q) ||
|
||
|
|
strings.Contains(strings.ToLower(m.Name), q) ||
|
||
|
|
strings.Contains(strings.ToLower(m.Category), q) {
|
||
|
|
results = append(results, m)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return results
|
||
|
|
}
|
||
|
|
|
||
|
|
// ByCategory returns all modules in the given category.
|
||
|
|
func (idx *Index) ByCategory(category string) []Module {
|
||
|
|
var results []Module
|
||
|
|
for _, m := range idx.Modules {
|
||
|
|
if m.Category == category {
|
||
|
|
results = append(results, m)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return results
|
||
|
|
}
|
||
|
|
|
||
|
|
// Find returns the module with the given code, or false if not found.
|
||
|
|
func (idx *Index) Find(code string) (Module, bool) {
|
||
|
|
for _, m := range idx.Modules {
|
||
|
|
if m.Code == code {
|
||
|
|
return m, true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return Module{}, false
|
||
|
|
}
|