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  }