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  }