github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/plugins/pluginrpc-gen/main.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "flag" 6 "fmt" 7 "go/format" 8 "io/ioutil" 9 "os" 10 "unicode" 11 "unicode/utf8" 12 ) 13 14 type stringSet struct { 15 values map[string]struct{} 16 } 17 18 func (s stringSet) String() string { 19 return "" 20 } 21 22 func (s stringSet) Set(value string) error { 23 s.values[value] = struct{}{} 24 return nil 25 } 26 func (s stringSet) GetValues() map[string]struct{} { 27 return s.values 28 } 29 30 var ( 31 typeName = flag.String("type", "", "interface type to generate plugin rpc proxy for") 32 rpcName = flag.String("name", *typeName, "RPC name, set if different from type") 33 inputFile = flag.String("i", "", "input file path") 34 outputFile = flag.String("o", *inputFile+"_proxy.go", "output file path") 35 36 skipFuncs map[string]struct{} 37 flSkipFuncs = stringSet{make(map[string]struct{})} 38 39 flBuildTags = stringSet{make(map[string]struct{})} 40 ) 41 42 func errorOut(msg string, err error) { 43 if err == nil { 44 return 45 } 46 fmt.Fprintf(os.Stderr, "%s: %v\n", msg, err) 47 os.Exit(1) 48 } 49 50 func checkFlags() error { 51 if *outputFile == "" { 52 return fmt.Errorf("missing required flag `-o`") 53 } 54 if *inputFile == "" { 55 return fmt.Errorf("missing required flag `-i`") 56 } 57 return nil 58 } 59 60 func main() { 61 flag.Var(flSkipFuncs, "skip", "skip parsing for function") 62 flag.Var(flBuildTags, "tag", "build tags to add to generated files") 63 flag.Parse() 64 skipFuncs = flSkipFuncs.GetValues() 65 66 errorOut("error", checkFlags()) 67 68 pkg, err := Parse(*inputFile, *typeName) 69 errorOut(fmt.Sprintf("error parsing requested type %s", *typeName), err) 70 71 var analysis = struct { 72 InterfaceType string 73 RPCName string 74 BuildTags map[string]struct{} 75 *ParsedPkg 76 }{toLower(*typeName), *rpcName, flBuildTags.GetValues(), pkg} 77 var buf bytes.Buffer 78 79 errorOut("parser error", generatedTempl.Execute(&buf, analysis)) 80 src, err := format.Source(buf.Bytes()) 81 errorOut("error formatting generated source:\n"+buf.String(), err) 82 errorOut("error writing file", ioutil.WriteFile(*outputFile, src, 0644)) 83 } 84 85 func toLower(s string) string { 86 if s == "" { 87 return "" 88 } 89 r, n := utf8.DecodeRuneInString(s) 90 return string(unicode.ToLower(r)) + s[n:] 91 }