github.com/argoproj/argo-cd/v2@v2.10.9/hack/gen-docs/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "sort" 8 "strings" 9 10 "gopkg.in/yaml.v2" 11 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 12 13 "github.com/argoproj/notifications-engine/pkg/docs" 14 ) 15 16 func main() { 17 generateNotificationsDocs() 18 } 19 20 func generateNotificationsDocs() { 21 _ = os.RemoveAll("./docs/operator-manual/notifications/services") 22 _ = os.MkdirAll("./docs/operator-manual/notifications/services", 0755) 23 files, err := docs.CopyServicesDocs("./docs/operator-manual/notifications/services") 24 if err != nil { 25 log.Fatal(err) 26 } 27 if files != nil { 28 if e := updateMkDocsNav("Operator Manual", "Notifications", "Notification Services", files); e != nil { 29 log.Fatal(e) 30 } 31 } 32 } 33 34 func updateMkDocsNav(parent string, child string, subchild string, files []string) error { 35 trimPrefixes(files, "docs/") 36 sort.Strings(files) 37 data, err := os.ReadFile("mkdocs.yml") 38 if err != nil { 39 return err 40 } 41 var un unstructured.Unstructured 42 if e := yaml.Unmarshal(data, &un.Object); e != nil { 43 return e 44 } 45 nav := un.Object["nav"].([]interface{}) 46 rootitem, _ := findNavItem(nav, parent) 47 if rootitem == nil { 48 return fmt.Errorf("Can't find '%s' root item in mkdoc.yml", parent) 49 } 50 rootnavitemmap := rootitem.(map[interface{}]interface{}) 51 childnav, _ := findNavItem(rootnavitemmap[parent].([]interface{}), child) 52 if childnav == nil { 53 return fmt.Errorf("Can't find '%s' chile item under '%s' parent item in mkdoc.yml", child, parent) 54 } 55 56 childnavmap := childnav.(map[interface{}]interface{}) 57 childnavitems := childnavmap[child].([]interface{}) 58 59 childnavitems = removeNavItem(childnavitems, subchild) 60 commands := make(map[string]interface{}) 61 commands[subchild] = files 62 childnavmap[child] = append(childnavitems, commands) 63 newmkdocs, err := yaml.Marshal(un.Object) 64 if err != nil { 65 return err 66 } 67 return os.WriteFile("mkdocs.yml", newmkdocs, 0644) 68 } 69 70 func trimPrefixes(files []string, prefix string) { 71 for i, f := range files { 72 files[i] = strings.TrimPrefix(f, prefix) 73 } 74 } 75 76 func findNavItem(nav []interface{}, key string) (interface{}, int) { 77 for i, item := range nav { 78 o, ismap := item.(map[interface{}]interface{}) 79 if ismap { 80 if _, ok := o[key]; ok { 81 return o, i 82 } 83 } 84 } 85 return nil, -1 86 } 87 88 func removeNavItem(nav []interface{}, key string) []interface{} { 89 _, i := findNavItem(nav, key) 90 if i != -1 { 91 nav = append(nav[:i], nav[i+1:]...) 92 } 93 return nav 94 }