1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
package main
import (
"errors"
"flag"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/mailru/easyjson/bootstrap"
// Reference the gen package to be friendly to vendoring tools,
// as it is an indirect dependency.
// (The temporary bootstrapping code uses it.)
_ "github.com/mailru/easyjson/gen"
"github.com/mailru/easyjson/parser"
)
var (
Version = "dev" //
Commit = "none"
)
var buildTags = flag.String("build_tags", "", "build tags to add to generated file")
var genBuildFlags = flag.String("gen_build_flags", "", "build flags when running the generator while bootstrapping")
var snakeCase = flag.Bool("snake_case", false, "use snake_case names instead of CamelCase by default")
var lowerCamelCase = flag.Bool("lower_camel_case", false, "use lowerCamelCase names instead of CamelCase by default")
var noStdMarshalers = flag.Bool("no_std_marshalers", false, "don't generate MarshalJSON/UnmarshalJSON funcs")
var omitEmpty = flag.Bool("omit_empty", false, "omit empty fields by default")
var allStructs = flag.Bool("all", false, "generate marshaler/unmarshalers for all structs in a file")
var simpleBytes = flag.Bool("byte", false, "use simple bytes instead of Base64Bytes for slice of bytes")
var leaveTemps = flag.Bool("leave_temps", false, "do not delete temporary files")
var stubs = flag.Bool("stubs", false, "only generate stubs for marshaler/unmarshaler funcs")
var noformat = flag.Bool("noformat", false, "do not run 'gofmt -w' on output file")
var specifiedName = flag.String("output_filename", "", "specify the filename of the output")
var processPkg = flag.Bool("pkg", false, "process the whole package instead of just the given file")
var disallowUnknownFields = flag.Bool("disallow_unknown_fields", false, "return error if any unknown field in json appeared")
var skipMemberNameUnescaping = flag.Bool("disable_members_unescape", false, "don't perform unescaping of member names to improve performance")
var showVersion = flag.Bool("version", false, "print version and exit")
func generate(fname string) (err error) {
fInfo, err := os.Stat(fname)
if err != nil {
return err
}
p := parser.Parser{AllStructs: *allStructs}
if err := p.Parse(fname, fInfo.IsDir()); err != nil {
return fmt.Errorf("Error parsing %v: %v", fname, err)
}
var outName string
if fInfo.IsDir() {
outName = filepath.Join(fname, p.PkgName+"_easyjson.go")
} else {
if s := strings.TrimSuffix(fname, ".go"); s == fname {
return errors.New("Filename must end in '.go'")
} else {
outName = s + "_easyjson.go"
}
}
if *specifiedName != "" {
outName = *specifiedName
}
var trimmedBuildTags string
if *buildTags != "" {
trimmedBuildTags = strings.TrimSpace(*buildTags)
}
var trimmedGenBuildFlags string
if *genBuildFlags != "" {
trimmedGenBuildFlags = strings.TrimSpace(*genBuildFlags)
}
g := bootstrap.Generator{
BuildTags: trimmedBuildTags,
GenBuildFlags: trimmedGenBuildFlags,
PkgPath: p.PkgPath,
PkgName: p.PkgName,
Types: p.StructNames,
SnakeCase: *snakeCase,
LowerCamelCase: *lowerCamelCase,
NoStdMarshalers: *noStdMarshalers,
DisallowUnknownFields: *disallowUnknownFields,
SkipMemberNameUnescaping: *skipMemberNameUnescaping,
OmitEmpty: *omitEmpty,
LeaveTemps: *leaveTemps,
OutName: outName,
StubsOnly: *stubs,
NoFormat: *noformat,
SimpleBytes: *simpleBytes,
}
if err := g.Run(); err != nil {
return fmt.Errorf("Bootstrap failed: %v", err)
}
return nil
}
func main() {
flag.Parse()
files := flag.Args()
if *showVersion {
fmt.Printf("easyjson generator\nversion: %s\ncommit: %s\n", Version, Commit)
os.Exit(0)
}
gofile := os.Getenv("GOFILE")
if *processPkg {
gofile = filepath.Dir(gofile)
}
if len(files) == 0 && gofile != "" {
files = []string{gofile}
} else if len(files) == 0 {
flag.Usage()
os.Exit(1)
}
for _, fname := range files {
if err := generate(fname); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
}
|