package uci import ( "strings" ) type UCI struct { Packages []*Package `parser:"@@*" json:"packages"` } type Package struct { Name string `parser:"'package' @Ident" json:"name"` Configs []*Config `parser:"@@*" json:"configs"` } type Config struct { Name string `parser:"'config' @Ident" json:"name"` Section *string `parser:"@String?" json:"section,omitempty"` Options []Option `parser:"@@*" json:"options"` } type Option struct { Type string `parser:"@( 'list' | 'option' )" json:"type"` Name string `parser:"@Ident" json:"name"` Value string `parser:"@String" json:"value"` } func (u *UCI) Export() string { var sb strings.Builder for pkgIdx, pkg := range u.Packages { if pkgIdx > 0 { sb.WriteString("\n") } sb.WriteString("package ") sb.WriteString(pkg.Name) sb.WriteString("\n") for _, cfg := range pkg.Configs { sb.WriteString("\n") sb.WriteString("config ") sb.WriteString(cfg.Name) if cfg.Section != nil { sb.WriteString(" '") sb.WriteString(*cfg.Section) sb.WriteString("'") } for _, opt := range cfg.Options { sb.WriteString("\n") sb.WriteString("\t") sb.WriteString(opt.Type) sb.WriteString(" ") sb.WriteString(opt.Name) sb.WriteString(" '") sb.WriteString(opt.Value) sb.WriteString("'") } sb.WriteString("\n") } } return sb.String() } func NewUCI() *UCI { return &UCI{ Packages: make([]*Package, 0), } }