github.com/ManabuSeki/goa-v1@v1.4.3/goagen/gen_schema/generator.go (about) 1 package genschema 2 3 import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 10 "github.com/goadesign/goa/design" 11 "github.com/goadesign/goa/goagen/codegen" 12 "github.com/goadesign/goa/goagen/utils" 13 ) 14 15 //NewGenerator returns an initialized instance of a JavaScript Client Generator 16 func NewGenerator(options ...Option) *Generator { 17 g := &Generator{} 18 19 for _, option := range options { 20 option(g) 21 } 22 23 return g 24 } 25 26 // Generator is the application code generator. 27 type Generator struct { 28 API *design.APIDefinition // The API definition 29 OutDir string // Path to output directory 30 genfiles []string // Generated files 31 } 32 33 // Generate is the generator entry point called by the meta generator. 34 func Generate() (files []string, err error) { 35 var outDir, ver string 36 set := flag.NewFlagSet("app", flag.PanicOnError) 37 set.StringVar(&outDir, "out", "", "") 38 set.StringVar(&ver, "version", "", "") 39 set.String("design", "", "") 40 set.Parse(os.Args[1:]) 41 42 if err := codegen.CheckVersion(ver); err != nil { 43 return nil, err 44 } 45 46 g := &Generator{OutDir: outDir, API: design.Design} 47 48 return g.Generate() 49 } 50 51 // Generate produces the skeleton main. 52 func (g *Generator) Generate() (_ []string, err error) { 53 if g.API == nil { 54 return nil, fmt.Errorf("missing API definition, make sure design is properly initialized") 55 } 56 57 go utils.Catch(nil, func() { g.Cleanup() }) 58 59 defer func() { 60 if err != nil { 61 g.Cleanup() 62 } 63 }() 64 65 s := APISchema(g.API) 66 js, err := s.JSON() 67 if err != nil { 68 return 69 } 70 71 g.OutDir = filepath.Join(g.OutDir, "schema") 72 os.RemoveAll(g.OutDir) 73 os.MkdirAll(g.OutDir, 0755) 74 g.genfiles = append(g.genfiles, g.OutDir) 75 schemaFile := filepath.Join(g.OutDir, "schema.json") 76 if err = ioutil.WriteFile(schemaFile, js, 0644); err != nil { 77 return 78 } 79 g.genfiles = append(g.genfiles, schemaFile) 80 81 return g.genfiles, nil 82 } 83 84 // Cleanup removes all the files generated by this generator during the last invokation of Generate. 85 func (g *Generator) Cleanup() { 86 for _, f := range g.genfiles { 87 os.Remove(f) 88 } 89 g.genfiles = nil 90 }