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  }