1 package main 2 3 import ( 4 "errors" 5 "flag" 6 "fmt" 7 "os" 8 "path/filepath" 9 ) 10 11 func main() { 12 if err := run(); err != nil { 13 fmt.Fprintln(os.Stderr, err) 14 15 os.Exit(1) 16 } 17 } 18 19 func run() error { 20 var typename, module, output string 21 22 flag.StringVar(&typename, "type", "", "typename to provide marshal/unmarshal functions for") 23 flag.StringVar(&module, "module", "", "path to local module") 24 flag.StringVar(&output, "o", "", "output file") 25 26 flag.Parse() 27 28 ignore, err := ignoreOutputFile(module, output) 29 if err != nil { 30 return err 31 } 32 33 pkg, err := ParsePackage(module, ignore...) 34 if err != nil { 35 return err 36 } 37 38 typ := pkg.Scope().Lookup(typename) 39 if typ == nil { 40 return ErrNotFound 41 } 42 43 var p processor 44 45 p.processType(typ.Type()) 46 47 return nil 48 } 49 50 func ignoreOutputFile(module, output string) ([]string, error) { 51 if output == "" || output == "-" { 52 return nil, nil 53 } 54 55 var ignore []string 56 57 o, err := filepath.Abs(output) 58 if err != nil { 59 return nil, err 60 } 61 62 m, err := filepath.Abs(module) 63 if err != nil { 64 return nil, err 65 } 66 67 if filepath.Dir(o) == filepath.Clean(m) { 68 ignore = []string{filepath.Base(o)} 69 } 70 71 return ignore, nil 72 } 73 74 var ErrNotFound = errors.New("typename not found") 75