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  }