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  }