package main import "strconv" // getString extracts a string value from content map. func getString(content map[string]any, key string) string { if content == nil { return "" } if v, ok := content[key].(string); ok { return v } return "" } // getBool extracts a bool value from content map (handles JSON unmarshalling forms). func getBool(content map[string]any, key string, defaultVal bool) bool { if content == nil { return defaultVal } if v, ok := content[key].(bool); ok { return v } if v, ok := content[key].(string); ok { if b, err := strconv.ParseBool(v); err == nil { return b } } return defaultVal } // getSlice extracts a slice of maps from content. func getSlice(content map[string]any, key string) []map[string]any { if content == nil { return nil } if v, ok := content[key].([]any); ok { result := make([]map[string]any, 0, len(v)) for _, item := range v { if m, ok := item.(map[string]any); ok { result = append(result, m) } } return result } return nil } // getNested extracts a nested map from content for sub-object fields (e.g. CTA link). func getNested(content map[string]any, key string) map[string]any { if content == nil { return nil } if v, ok := content[key].(map[string]any); ok { return v } return nil } // linkHref returns the href value from a link object (label/href shape), // defaulting to "#" when missing so anchors stay valid. func linkHref(link map[string]any) string { if href := getString(link, "href"); href != "" { return href } if url := getString(link, "url"); url != "" { return url } return "#" } // linkLabel returns the visible label for a link object. func linkLabel(link map[string]any, fallback string) string { if label := getString(link, "label"); label != "" { return label } if text := getString(link, "text"); text != "" { return text } return fallback }