88 "go/token"
99 "io"
1010 "io/ioutil"
11+ "log"
1112 "os"
1213 "path/filepath"
1314 "runtime/debug"
@@ -23,7 +24,11 @@ import (
2324 "golang.org/x/tools/go/packages"
2425)
2526
26- const devVersion = "dev"
27+ const (
28+ devVersion = "dev"
29+ runMode = "go-run"
30+ directMode = "direct"
31+ )
2732
2833var (
2934 //do not modify the following vars
@@ -51,11 +56,12 @@ var helpers = template.FuncMap{
5156
5257type (
5358 options struct {
54- interfaces []interfaceInfo
55- noGenerate bool
56- suffix string
57- mockNames []string
58- packageNames []string
59+ interfaces []interfaceInfo
60+ noGenerate bool
61+ suffix string
62+ mockNames []string
63+ packageNames []string
64+ goGenerateMode string
5965 }
6066
6167 interfaceInfo struct {
@@ -109,7 +115,7 @@ func getVersion(version string, buildInfo *debug.BuildInfo) string {
109115}
110116
111117func main () {
112- opts , err := processArgs (os .Args [1 :], os .Stdout , os .Stderr )
118+ opts , err := processArgs (os .Args [0 ], os . Args [ 1 :], os .Stdout , os .Stderr )
113119 if err != nil {
114120 if err == errInvalidArguments {
115121 os .Exit (2 )
@@ -162,6 +168,7 @@ func run(opts *options) (err error) {
162168 "GenerateInstruction" : ! opts .noGenerate ,
163169 "Version" : version ,
164170 "PackageName" : packageName ,
171+ "GoGenerateMode" : opts .goGenerateMode ,
165172 },
166173 Vars : map [string ]interface {}{},
167174 Funcs : helpers ,
@@ -374,9 +381,27 @@ func processNames(names string, interfacesNum int, isInterfaceWildeCarded bool)
374381 return namesSplitted , nil
375382}
376383
384+ func processGoGenerateMode (cmd string , args []string , goGenerateMode string ) (string , error ) {
385+ log .Println (cmd )
386+ log .Println (args )
387+ log .Println (goGenerateMode )
388+ if goGenerateMode != "" && goGenerateMode != directMode && goGenerateMode != runMode {
389+ return "" , fmt .Errorf ("wrong mode value" )
390+ }
391+
392+ if goGenerateMode != "" {
393+ return goGenerateMode , nil
394+ }
395+ if cmd == "go" && len (args ) > 0 && args [0 ] == "run" {
396+ return runMode , nil
397+ }
398+
399+ return directMode , nil
400+ }
401+
377402var errInvalidArguments = errors .New ("invalid arguments" )
378403
379- func processArgs (args []string , stdout , stderr io.Writer ) (* options , error ) {
404+ func processArgs (cmd string , args []string , stdout , stderr io.Writer ) (* options , error ) {
380405 var opts options
381406
382407 fs := flag .NewFlagSet ("" , flag .ContinueOnError )
@@ -390,6 +415,10 @@ func processArgs(args []string, stdout, stderr io.Writer) (*options, error) {
390415 packageNames := fs .String ("p" , "" , "comma-separated package names,\n by default the generated package names are taken from the destination directory names" )
391416 help := fs .Bool ("h" , false , "show this help message" )
392417 version := fs .Bool ("version" , false , "display version information and exit" )
418+ goGenerateMode := fs .String ("go-generate-mode" , "" , `changes go:generate command mode: direct/go-run.
419+ By default puts "go:generate minimock args..." instruction into generated code if mock was generated with minimock command.
420+ If mock was generated with go run github.com/gojuno/minimock/v3/cmd/minimock then it puts "go:generate go run github.com/gojuno/minimock/v3/cmd/minimock args...".
421+ This behaviour can be rewritten by explicitly specifying mode with flag.` )
393422
394423 fs .Usage = func () { usage (fs , stderr ) }
395424
@@ -407,6 +436,12 @@ func processArgs(args []string, stdout, stderr io.Writer) (*options, error) {
407436 return nil , nil
408437 }
409438
439+ cmdMode , err := processGoGenerateMode (cmd , args , * goGenerateMode )
440+ if err != nil {
441+ return nil , fmt .Errorf ("processing -go-generate-mode flag arguments: %w" , err )
442+ }
443+ opts .goGenerateMode = cmdMode
444+
410445 interfaces := strings .Split (* input , "," )
411446 interfacesLen := len (interfaces )
412447 isWildecarded := strings .Contains (* input , "*" )
0 commit comments