github.com/thlcodes/genfig@v0.3.2-alpha/main.go (about) 1 //go:generate sh -c "printf 'package main\n\nfunc init() {\n\tversion = \"%s\"\n}\n' $(cat VERSION) > version.go" 2 3 package main 4 5 import ( 6 "flag" 7 "fmt" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "strings" 12 13 "go/parser" 14 "go/token" 15 16 "github.com/thlcodes/genfig/generator" 17 "github.com/thlcodes/genfig/writers" 18 19 "github.com/thlcodes/genfig/models" 20 "github.com/thlcodes/genfig/util" 21 ) 22 23 const project = "genfig" 24 25 var version = "v0.0.0-dev" 26 27 func init() { 28 flag.Usage = func() { 29 fmt.Printf("Usage of %s %s:\n", project, version) 30 flag.PrintDefaults() 31 } 32 } 33 34 func main() { 35 defer func() { 36 if r := recover(); r != nil { 37 fmt.Printf("\nERROR: %v\n\n", r) 38 flag.Usage() 39 os.Exit(1) 40 } 41 }() 42 run() 43 } 44 45 func run() { 46 var ( 47 helpFlag = flag.Bool("help", false, "print this usage help") 48 versionFlag = flag.Bool("version", false, "print version") 49 maxLevel = flag.Int("maxlevel", 5, "Maximum recursion level") 50 dir = flag.String("dir", "./config", "directory to write generated files into") 51 ) 52 53 flag.Parse() 54 55 if *versionFlag { 56 fmt.Printf("%s %s", project, version) 57 return 58 } 59 if *helpFlag { 60 flag.Usage() 61 return 62 } 63 64 writers.SetMaxLevel(*maxLevel) 65 66 args := flag.Args() 67 if len(args) == 0 { 68 args = []string{"*"} 69 } 70 71 fmt.Printf("Called with \n\tdir:\t'%s'\n\targs:\t%s\n\n", *dir, strings.Join(args, ", ")) 72 73 files := util.ResolveGlobs(args...) 74 if len(files) == 0 { 75 panic("No input files found") 76 } 77 78 params := models.Params{ 79 Dir: *dir, 80 } 81 fmt.Printf("Generating from files: %s\n", strings.Join(files, ", ")) 82 83 gofiles, err := generator.Generate(files, params) 84 if err != nil { 85 panic(fmt.Sprintf("%v", err)) 86 } 87 88 fmt.Println("\nChecking generaded code ...") 89 path, _ := filepath.Abs(*dir) 90 fset := token.NewFileSet() 91 if _, err := parser.ParseDir(fset, path, nil, 0); err != nil { 92 panic(fmt.Sprintf("At least one error in generated code: %v", err)) 93 } 94 95 fmt.Println("\nFormatting generade code with gofmt ...") 96 if err := exec.Command("gofmt", "-w", ".").Run(); err != nil { 97 fmt.Printf("\nCould not format code: %v, continuing anyway.", err) 98 } 99 100 fmt.Printf("\nSuccessfully generated %d files: %s\n", len(gofiles), strings.Join(gofiles, ", ")) 101 }