2016-08-29 14:00:18 +02:00
|
|
|
package main
|
|
|
|
|
2016-09-21 22:49:12 +02:00
|
|
|
import (
|
2016-09-21 23:02:49 +02:00
|
|
|
"bytes"
|
2018-06-04 14:22:28 +02:00
|
|
|
"errors"
|
2016-09-21 22:49:12 +02:00
|
|
|
"flag"
|
|
|
|
"fmt"
|
2016-09-21 23:02:49 +02:00
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
2016-09-21 22:49:12 +02:00
|
|
|
"os"
|
2019-11-03 16:12:56 +01:00
|
|
|
"path/filepath"
|
2016-09-21 22:49:12 +02:00
|
|
|
|
2017-07-11 21:02:46 +02:00
|
|
|
"github.com/matryer/moq/pkg/moq"
|
2016-09-21 22:49:12 +02:00
|
|
|
)
|
|
|
|
|
2021-02-14 14:07:18 +01:00
|
|
|
// Version is the command version, injected at build time.
|
|
|
|
var Version string = "dev"
|
2020-09-02 11:30:40 +02:00
|
|
|
|
2019-12-23 16:10:26 +01:00
|
|
|
type userFlags struct {
|
2020-09-17 10:49:08 +02:00
|
|
|
outFile string
|
|
|
|
pkgName string
|
|
|
|
formatter string
|
|
|
|
stubImpl bool
|
|
|
|
skipEnsure bool
|
2021-07-11 08:35:54 +02:00
|
|
|
remove bool
|
2020-09-17 10:49:08 +02:00
|
|
|
args []string
|
2019-12-23 16:10:26 +01:00
|
|
|
}
|
|
|
|
|
2016-08-29 14:00:18 +02:00
|
|
|
func main() {
|
2019-12-23 16:10:26 +01:00
|
|
|
var flags userFlags
|
|
|
|
flag.StringVar(&flags.outFile, "out", "", "output file (default stdout)")
|
|
|
|
flag.StringVar(&flags.pkgName, "pkg", "", "package name (default will infer)")
|
2020-08-16 09:25:01 +02:00
|
|
|
flag.StringVar(&flags.formatter, "fmt", "", "go pretty-printer: gofmt, goimports or noop (default gofmt)")
|
2020-08-16 08:59:28 +02:00
|
|
|
flag.BoolVar(&flags.stubImpl, "stub", false,
|
2020-08-16 08:54:12 +02:00
|
|
|
"return zero values when no mock implementation is provided, do not panic")
|
2020-09-18 10:16:40 +02:00
|
|
|
printVersion := flag.Bool("version", false, "show the version for moq")
|
2020-09-17 10:49:08 +02:00
|
|
|
flag.BoolVar(&flags.skipEnsure, "skip-ensure", false,
|
|
|
|
"suppress mock implementation check, avoid import cycle if mocks generated outside of the tested package")
|
2021-07-11 08:35:54 +02:00
|
|
|
flag.BoolVar(&flags.remove, "rm", false, "first remove output file, if it exists")
|
2016-10-14 11:57:57 +02:00
|
|
|
|
2016-09-21 22:49:12 +02:00
|
|
|
flag.Usage = func() {
|
2020-03-10 14:08:14 +01:00
|
|
|
fmt.Println(`moq [flags] source-dir interface [interface2 [interface3 [...]]]`)
|
2016-09-21 22:49:12 +02:00
|
|
|
flag.PrintDefaults()
|
2019-11-05 08:43:49 +01:00
|
|
|
fmt.Println(`Specifying an alias for the mock is also supported with the format 'interface:alias'`)
|
|
|
|
fmt.Println(`Ex: moq -pkg different . MyInterface:MyMock`)
|
2016-09-21 22:49:12 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
|
2016-09-21 22:49:12 +02:00
|
|
|
flag.Parse()
|
2019-12-23 16:10:26 +01:00
|
|
|
flags.args = flag.Args()
|
|
|
|
|
2020-09-18 10:16:40 +02:00
|
|
|
if *printVersion {
|
2021-02-14 14:11:59 +01:00
|
|
|
fmt.Printf("moq version %s\n", Version)
|
2020-09-18 10:16:40 +02:00
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
2019-12-23 16:10:26 +01:00
|
|
|
if err := run(flags); err != nil {
|
|
|
|
fmt.Fprintln(os.Stderr, err)
|
|
|
|
flag.Usage()
|
|
|
|
os.Exit(1)
|
2016-09-21 22:49:12 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func run(flags userFlags) error {
|
|
|
|
if len(flags.args) < 2 {
|
|
|
|
return errors.New("not enough arguments")
|
|
|
|
}
|
|
|
|
|
2021-07-11 08:35:54 +02:00
|
|
|
if flags.remove && flags.outFile != "" {
|
|
|
|
if err := os.Remove(flags.outFile); err != nil {
|
|
|
|
if !errors.Is(err, os.ErrNotExist) {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-21 23:02:49 +02:00
|
|
|
var buf bytes.Buffer
|
2019-12-23 16:10:26 +01:00
|
|
|
var out io.Writer = os.Stdout
|
|
|
|
if flags.outFile != "" {
|
2016-09-21 23:02:49 +02:00
|
|
|
out = &buf
|
2016-09-21 22:49:12 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
|
2020-03-10 14:08:14 +01:00
|
|
|
srcDir, args := flags.args[0], flags.args[1:]
|
|
|
|
m, err := moq.New(moq.Config{
|
2020-09-17 10:49:08 +02:00
|
|
|
SrcDir: srcDir,
|
|
|
|
PkgName: flags.pkgName,
|
|
|
|
Formatter: flags.formatter,
|
|
|
|
StubImpl: flags.stubImpl,
|
|
|
|
SkipEnsure: flags.skipEnsure,
|
2020-03-10 14:08:14 +01:00
|
|
|
})
|
2016-09-21 22:49:12 +02:00
|
|
|
if err != nil {
|
2019-12-23 16:10:26 +01:00
|
|
|
return err
|
2016-09-21 22:49:12 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
|
|
|
|
if err = m.Mock(out, args...); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if flags.outFile == "" {
|
|
|
|
return nil
|
2016-09-21 23:02:49 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
|
2016-09-21 23:02:49 +02:00
|
|
|
// create the file
|
2020-12-13 04:51:03 +01:00
|
|
|
err = os.MkdirAll(filepath.Dir(flags.outFile), 0750)
|
2019-12-23 16:10:26 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2016-09-21 23:02:49 +02:00
|
|
|
}
|
2019-12-23 16:10:26 +01:00
|
|
|
|
2020-12-13 04:51:03 +01:00
|
|
|
return ioutil.WriteFile(flags.outFile, buf.Bytes(), 0600)
|
2016-08-29 14:00:18 +02:00
|
|
|
}
|