go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/apps/provider-scaffold/provider-scaffold.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package main 5 6 import ( 7 "embed" 8 "fmt" 9 "io/fs" 10 "os" 11 "path/filepath" 12 "strings" 13 "text/template" 14 "unicode" 15 16 "github.com/rs/zerolog/log" 17 "github.com/spf13/pflag" 18 ) 19 20 //go:embed template/* 21 var templates embed.FS 22 23 type config struct { 24 Path string 25 ProviderID string 26 CamelcaseProviderID string 27 ProviderName string 28 GoPackage string 29 } 30 31 func main() { 32 flags := pflag.NewFlagSet("", pflag.ContinueOnError) 33 dir := flags.String("path", "", "path directory where you want to generate the files into") 34 providerID := flags.String("provider-id", "", "provider id") 35 providerName := flags.String("provider-name", "", "provider name") 36 goPackage := flags.String("go-package", "", "go package") 37 38 if err := flags.Parse(os.Args); err != nil { 39 if err == pflag.ErrHelp { 40 os.Exit(0) 41 } 42 log.Fatal().Err(err).Msg("error: could not parse flags") 43 } 44 45 if *dir == "" { 46 log.Fatal().Msg("--path is required") 47 } 48 49 if *providerID == "" { 50 log.Fatal().Msg("--provider-id is required") 51 } 52 53 if *providerName == "" { 54 log.Fatal().Msg("--provider-name is required") 55 } 56 57 if *goPackage == "" { 58 log.Fatal().Msg("--go-package is required") 59 } 60 61 err := os.MkdirAll(*dir, os.ModePerm) 62 if err != nil { 63 log.Fatal().Err(err).Msg("could not ensure the provided directory exists") 64 } 65 66 err = generateProvider(config{ 67 Path: *dir, 68 ProviderID: *providerID, 69 ProviderName: *providerName, 70 GoPackage: *goPackage, 71 CamelcaseProviderID: capitalize(*providerID), 72 }) 73 if err != nil { 74 log.Fatal().Err(err).Msg("could not generate provider files") 75 } 76 } 77 78 func capitalize(str string) string { 79 runes := []rune(str) 80 runes[0] = unicode.ToUpper(runes[0]) 81 return string(runes) 82 } 83 84 func generateProvider(cfg config) error { 85 return fs.WalkDir(templates, ".", func(sourceFile string, info fs.DirEntry, err error) error { 86 if err != nil { 87 return err 88 } 89 if info.IsDir() { 90 return nil 91 } 92 93 if filepath.Ext(sourceFile) != ".template" { 94 return nil 95 } 96 97 base, _ := filepath.Rel("template", sourceFile) 98 fmt.Println("Render " + base) 99 100 path := strings.TrimSuffix(base, ".template") 101 path = strings.ReplaceAll(path, "providerid", cfg.ProviderID) 102 103 rootDir := filepath.Join(cfg.Path, filepath.Dir(path)) 104 fmt.Println("Create dir " + rootDir) 105 err = os.MkdirAll(rootDir, os.ModePerm) 106 if err != nil { 107 return err 108 } 109 110 destinationFile := filepath.Join(cfg.Path, path) 111 fmt.Println("Render file" + destinationFile) 112 113 input, err := fs.ReadFile(templates, sourceFile) 114 if err != nil { 115 return err 116 } 117 118 tmpl, err := template.New(destinationFile).Parse(string(input)) 119 if err != nil { 120 return err 121 } 122 123 w, err := os.OpenFile(destinationFile, os.O_CREATE|os.O_WRONLY, 0o644) 124 if err != nil { 125 fmt.Println("Error creating", destinationFile) 126 return err 127 } 128 defer w.Close() 129 130 err = tmpl.Execute(w, cfg) 131 if err != nil { 132 return err 133 } 134 135 return nil 136 }) 137 }