3588AdminBackend/internal/service/template_slots.go

68 lines
1.9 KiB
Go

package service
import "fmt"
type TemplateSlotGroup struct {
Inputs []TemplateSlot `json:"inputs"`
Services []TemplateSlot `json:"services"`
Outputs []TemplateSlot `json:"outputs"`
}
type TemplateSlot struct {
Name string `json:"name"`
Type string `json:"type"`
Required bool `json:"required"`
Description string `json:"description"`
}
func parseTemplateSlots(raw map[string]any) (TemplateSlotGroup, error) {
group := TemplateSlotGroup{}
slotsMap, _ := raw["slots"].(map[string]any)
if slotsMap == nil {
return group, nil
}
var err error
if group.Inputs, err = parseTemplateSlotList(slotsMap["inputs"]); err != nil {
return TemplateSlotGroup{}, fmt.Errorf("parse input slots: %w", err)
}
if group.Services, err = parseTemplateSlotList(slotsMap["services"]); err != nil {
return TemplateSlotGroup{}, fmt.Errorf("parse service slots: %w", err)
}
if group.Outputs, err = parseTemplateSlotList(slotsMap["outputs"]); err != nil {
return TemplateSlotGroup{}, fmt.Errorf("parse output slots: %w", err)
}
return group, nil
}
func parseTemplateSlotList(raw any) ([]TemplateSlot, error) {
items, _ := raw.([]any)
if len(items) == 0 {
return nil, nil
}
out := make([]TemplateSlot, 0, len(items))
for _, item := range items {
slotMap, _ := item.(map[string]any)
if slotMap == nil {
return nil, fmt.Errorf("slot entry must be an object")
}
slot := TemplateSlot{
Name: stringValue(slotMap["name"]),
Type: stringValue(slotMap["type"]),
Required: boolValue(slotMap["required"], false),
Description: stringValue(slotMap["description"]),
}
if slot.Name == "" {
return nil, fmt.Errorf("slot name is required")
}
if err := validateConfigName(slot.Name); err != nil {
return nil, fmt.Errorf("invalid slot name %q: %w", slot.Name, err)
}
if slot.Type == "" {
return nil, fmt.Errorf("slot type is required for %s", slot.Name)
}
out = append(out, slot)
}
return out, nil
}