package descriptors import ( "fmt" "strings" ui "github.com/DegustatorPonos/RuinesOfRafdolon/UI" rl "github.com/gen2brain/raylib-go/raylib" ) type UIElementDescriptor struct { Type string Weight float32 Style StyleDescriptor // For labels Text string Alignment string // For grid elements Children []UIElementDescriptor Spacing float32 } func InitUIParser() { typeParsers = map[string]func(*UIElementDescriptor) ui.UIElement { ui.VoidTypeName: parseAsVoid, ui.LabelTypeName: parseAsLabel, ui.GridRowTypeName: parseAsGridRow, } } // The item type to its parser relationship var typeParsers map[string]func(*UIElementDescriptor) ui.UIElement func (base *UIElementDescriptor) Parse() (ui.UIElement, error) { var elemType = strings.ToLower(base.Type) var descFunc, exists = typeParsers[elemType] if exists { return descFunc(base), nil } return nil, fmt.Errorf("Unknown UI element type") } func parseAsVoid(base *UIElementDescriptor) ui.UIElement { return &ui.Void { Weight: base.Weight, } } func parseAsLabel(base *UIElementDescriptor) ui.UIElement { var alignment ui.TextAlignment switch strings.ToLower(base.Alignment) { case "center": alignment = ui.Center case "start": alignment = ui.Start } return &ui.Label { Weight: base.Weight, Text: base.Text, Alignment: alignment, Style: base.Style.Parse(), } } func parseAsGridRow(base *UIElementDescriptor) ui.UIElement { var outp = ui.GridRow { Weight: base.Weight, Spacing: base.Spacing, Style: base.Style.Parse(), Objects: make([]ui.UIElement, 0, len(base.Children)), } for _, v := range base.Children { var child, parseErr = v.Parse() if parseErr != nil { rl.TraceLog(rl.LogWarning, "Failed to parse a parent element of a grid row: %v", parseErr.Error()) continue } outp.Objects = append(outp.Objects, child) } return &outp }