github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/internal/commands/doc.go (about)

     1  package commands
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"text/template"
     8  
     9  	"github.com/hazelops/ize/internal/config"
    10  	"github.com/hazelops/ize/internal/schema"
    11  	"github.com/pterm/pterm"
    12  	"github.com/spf13/cobra"
    13  	"github.com/spf13/cobra/doc"
    14  	"golang.org/x/text/cases"
    15  	"golang.org/x/text/language"
    16  )
    17  
    18  func NewCmdDoc() *cobra.Command {
    19  	cmd := &cobra.Command{
    20  		Use:                   "doc",
    21  		Short:                 "Create docs",
    22  		DisableFlagsInUseLine: true,
    23  		Long:                  "Create docs with ize commands description",
    24  		RunE: func(cmd *cobra.Command, args []string) error {
    25  			cmd.SilenceUsage = true
    26  			err := os.MkdirAll("./website/commands", 0777)
    27  			if err != nil {
    28  				return err
    29  			}
    30  
    31  			pterm.DisableStyling()
    32  			pterm.DisableColor()
    33  
    34  			err = doc.GenMarkdownTree(newRootCmd(new(config.Project)), "./website/commands")
    35  			if err != nil {
    36  				return err
    37  			}
    38  
    39  			sections := []string{"main", "terraform", "ecs", "alias", "serverless", "tunnel"}
    40  
    41  			err = os.MkdirAll("./website/schema", 0777)
    42  			if err != nil {
    43  				return err
    44  			}
    45  
    46  			t := template.New("schema")
    47  			t, err = t.Parse(sectionTmpl)
    48  			if err != nil {
    49  				return err
    50  			}
    51  
    52  			for _, s := range sections {
    53  				err := generateSection(s, t)
    54  				if err != nil {
    55  					return err
    56  				}
    57  			}
    58  
    59  			pterm.EnableColor()
    60  			pterm.EnableStyling()
    61  
    62  			pterm.Success.Printfln("Docs generated")
    63  
    64  			return nil
    65  		},
    66  	}
    67  
    68  	return cmd
    69  }
    70  
    71  func generateSection(name string, t *template.Template) error {
    72  	s := schema.GetSchema()
    73  	filename := "README.md"
    74  	if name != "main" {
    75  		filename = strings.ToUpper(name) + ".md"
    76  		s = schema.GetSchema()[name].Items
    77  	}
    78  	f, err := os.Create(filepath.Join(".", "website", "schema", filename))
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	err = t.Execute(f, Section{
    84  		Name:  cases.Title(language.Und).String(name),
    85  		Items: s,
    86  	})
    87  	if err != nil {
    88  		return err
    89  	}
    90  	err = f.Close()
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	return nil
    96  }
    97  
    98  type Section struct {
    99  	Name string
   100  	schema.Items
   101  }
   102  
   103  var sectionTmpl = `# {{.Name}} Section
   104  | Parameter | Required | Description |
   105  | --- | --- | --- |
   106  {{range $k, $v := .Items}}| {{$k}} | {{if $v.Required}}yes{{else}}no{{end}}| {{$v.Description}} |
   107  {{end}}
   108  `