package main import ( "cmp" "fmt" "reflect" "slices" "github.com/goccy/go-yaml" "github.com/spf13/cobra" "os" ) type MapSlice yaml.MapSlice func (s MapSlice) Sort() { slices.SortFunc(s, func(a, b yaml.MapItem) int { keya := fmt.Sprintf("%s", a.Key) keyb := fmt.Sprintf("%s", b.Key) return cmp.Compare(keya, keyb) }) for _, item := range s { switch { case reflect.TypeOf(item.Value) == reflect.TypeOf(yaml.MapSlice{}): ((MapSlice)(item.Value.(yaml.MapSlice))).Sort() case Type(item.Value) == Slice: for _, v := range item.Value.([]any) { ms, ok := v.(yaml.MapSlice) if ok { ((MapSlice)(ms)).Sort() } } } } } func sortYaml(cmd *cobra.Command, args []string) error { for _, arg := range args { data, err := read(arg) if err != nil { return err } doc, err := parse(data) if err != nil { return fmt.Errorf("%s: %v\n", arg, err.Error()) } ((MapSlice)(doc)).Sort() if len(args) > 1 { fmt.Printf("---\n") } encode(os.Stdout, doc) } return nil }