package config import ( "fmt" "gopkg.in/yaml.v3" ) // UnmarshalYAML accepts either a scalar ("#7D56F4") applied to both // appearances, or a mapping ({light: "#...", dark: "#..."}). func (c *Color) UnmarshalYAML(n *yaml.Node) error { switch n.Kind { case yaml.ScalarNode: var s string if err := n.Decode(&s); err != nil { return err } c.Light, c.Dark = s, s return nil case yaml.MappingNode: var pair struct { Light string `yaml:"light"` Dark string `yaml:"dark"` } if err := n.Decode(&pair); err != nil { return err } c.Light, c.Dark = pair.Light, pair.Dark return nil default: return fmt.Errorf("color must be a string or a {light, dark} mapping, got %v", n.Kind) } } func (c Color) MarshalYAML() (interface{}, error) { if c.Light == c.Dark { return c.Light, nil } return map[string]string{"light": c.Light, "dark": c.Dark}, nil }