github.com/benma/gogen@v0.0.0-20160826115606-cf49914b915a/cmd/goautomock/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "path" 9 "regexp" 10 "strings" 11 12 "github.com/ernesto-jimenez/gogen/automock" 13 "github.com/ernesto-jimenez/gogen/importer" 14 "github.com/ernesto-jimenez/gogen/strconv" 15 ) 16 17 var ( 18 out = flag.String("o", "", "override the name of the generated code. Default value is by generated based on the name of the interface, e.g.: Reader -> reader_mock_test.go (use \"-\" to print to stdout)") 19 mockName = flag.String("mock-name", "", "override the name for the mock struct") 20 mockPkg = flag.String("mock-pkg", "", "override the package name for the mock") 21 pkg = flag.String("pkg", ".", "override package to get the interface from. It can be specified in the interface name, e.g.: goautomock io.Reader") 22 ) 23 24 func main() { 25 flag.Parse() 26 log.SetFlags(0) 27 28 iface := flag.Arg(0) 29 30 if iface == "" { 31 log.Fatal("need to specify an interface name") 32 } 33 34 parts := strings.Split(iface, ".") 35 switch len(parts) { 36 case 1: 37 case 2: 38 if *pkg != "." { 39 log.Fatalf("unexpected -pkg value (%q), package is already defined in the interface name as %s", *pkg, parts[0]) 40 } 41 *pkg = parts[0] 42 iface = parts[1] 43 default: 44 log.Fatalf("invalid interface %q", iface) 45 } 46 47 gen, err := automock.NewGenerator(*pkg, iface) 48 if err != nil { 49 log.Fatal(err) 50 } 51 52 if *mockName != "" { 53 gen.SetName(*mockName) 54 } 55 inPkg := *pkg == "." && path.Dir(*out) == "." 56 gen.SetInternal(inPkg) 57 if *mockPkg == "" && !inPkg { 58 p, err := importer.Default().Import(".") 59 if err != nil { 60 log.Fatal(err) 61 } 62 *mockPkg = p.Name() 63 } 64 if *mockPkg != "" { 65 gen.SetPackage(*mockPkg) 66 } 67 68 w := os.Stdout 69 if *out == "" { 70 *out = fmt.Sprintf("%s_test.go", gen.Name()) 71 if p := regexp.MustCompile(".*/").ReplaceAllString(*pkg, ""); !inPkg && p != "" && p != "." { 72 *out = p + "_" + *out 73 } 74 } 75 if *out != "-" { 76 *out = strconv.SnakeCase(*out) 77 log.Printf("Generating mock for %s in %s", iface, *out) 78 w, err = os.OpenFile(*out, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666) 79 if err != nil { 80 log.Fatal(err) 81 } 82 } 83 84 err = gen.Write(w) 85 switch err := err.(type) { 86 case automock.GenerationError: 87 log.Println(err.CodeWithLineNumbers()) 88 log.Fatal(err) 89 case error: 90 log.Fatal(err) 91 } 92 }