github.com/yogeshlonkar/moby@v1.13.2-0.20201203103638-c0b64beaea94/docs/yaml/generate.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "log" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "github.com/docker/docker/cli/command" 12 "github.com/docker/docker/cli/command/commands" 13 "github.com/docker/docker/pkg/term" 14 "github.com/spf13/cobra" 15 "github.com/spf13/pflag" 16 ) 17 18 const descriptionSourcePath = "docs/reference/commandline/" 19 20 func generateCliYaml(opts *options) error { 21 stdin, stdout, stderr := term.StdStreams() 22 dockerCli := command.NewDockerCli(stdin, stdout, stderr) 23 cmd := &cobra.Command{Use: "docker"} 24 commands.AddCommands(cmd, dockerCli) 25 source := filepath.Join(opts.source, descriptionSourcePath) 26 if err := loadLongDescription(cmd, source); err != nil { 27 return err 28 } 29 30 cmd.DisableAutoGenTag = true 31 return GenYamlTree(cmd, opts.target) 32 } 33 34 func loadLongDescription(cmd *cobra.Command, path ...string) error { 35 for _, cmd := range cmd.Commands() { 36 if cmd.Name() == "" { 37 continue 38 } 39 fullpath := filepath.Join(path[0], strings.Join(append(path[1:], cmd.Name()), "_")+".md") 40 41 if cmd.HasSubCommands() { 42 loadLongDescription(cmd, path[0], cmd.Name()) 43 } 44 45 if _, err := os.Stat(fullpath); err != nil { 46 log.Printf("WARN: %s does not exist, skipping\n", fullpath) 47 continue 48 } 49 50 content, err := ioutil.ReadFile(fullpath) 51 if err != nil { 52 return err 53 } 54 description, examples := parseMDContent(string(content)) 55 cmd.Long = description 56 cmd.Example = examples 57 } 58 return nil 59 } 60 61 type options struct { 62 source string 63 target string 64 } 65 66 func parseArgs() (*options, error) { 67 opts := &options{} 68 cwd, _ := os.Getwd() 69 flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError) 70 flags.StringVar(&opts.source, "root", cwd, "Path to project root") 71 flags.StringVar(&opts.target, "target", "/tmp", "Target path for generated yaml files") 72 err := flags.Parse(os.Args[1:]) 73 return opts, err 74 } 75 76 func main() { 77 opts, err := parseArgs() 78 if err != nil { 79 fmt.Fprintln(os.Stderr, err.Error()) 80 } 81 fmt.Printf("Project root: %s\n", opts.source) 82 fmt.Printf("Generating yaml files into %s\n", opts.target) 83 if err := generateCliYaml(opts); err != nil { 84 fmt.Fprintf(os.Stderr, "Failed to generate yaml files: %s\n", err.Error()) 85 } 86 }