//go generate package main import ( "flag" "fmt" "html/template" "log" "os" "strings" ) func main() { errorName := readErrorName() errorName = validateErrorName(errorName) data := &Data{ ErrorName: errorName, } errorFile := data.createFile("error.go.tmpl") data.createTemplate("error.go.tmpl", errorFile) if err := errorFile.Close(); err != nil { log.Fatal(err) } testFile := data.createFile("error_test.go.tmpl") data.createTemplate("error_test.go.tmpl", testFile) if err := testFile.Close(); err != nil { log.Fatal(err) } fmt.Print(` !!!!! Add status mapping in internal/api/grpc/caos_errors.go !!!!!`) } type Data struct { ErrorName string } func (data *Data) createFile(tmplName string) *os.File { filename := strings.Replace(tmplName, "error", strings.ToLower(data.ErrorName), 1) filename = filename[:len(filename)-5] filePath := fmt.Sprintf("../%s", filename) file, err := os.Create(filePath) if err != nil { log.Fatalf("unable to create file (%s): %v", filePath, err) } return file } func (data *Data) createTemplate(templateName string, file *os.File) { tmpl := template.Must(template.New(templateName).ParseFiles(templateName)) if err := tmpl.Execute(file, data); err != nil { log.Fatal("unable to execute tmpl: ", err) } } func readErrorName() (errorName string) { flag.StringVar(&errorName, "Name", "", "KeyType of the error (e.g. Internal)") flag.Parse() return errorName } func validateErrorName(errorName string) string { if errorName == "" { log.Fatal("pass argument name") } if strings.Contains(errorName, " ") || strings.Contains(errorName, ".") { log.Fatal("name cannot contain spaces or points") } return strings.Title(errorName) }