- // process all files in specified directory
- dir, err := filepath.Abs(inputDir)
- if err != nil {
- return fmt.Errorf("invalid input directory: %v\n", err)
- }
- files, err := getInputFiles(inputDir, 1)
- if err != nil {
- return fmt.Errorf("problem getting files from input directory: %v\n", err)
- } else if len(files) == 0 {
- return fmt.Errorf("no input files found in input directory: %v\n", dir)
- }
- for _, file := range files {
- if err := generateFromFile(file, outputDir, typesPkgs); err != nil {
- if continueErr {
- logrus.Warnf("code generation from %s failed: %v (error ignored)\n", file, err)
- continue
- } else {
- return fmt.Errorf("code generation from %s failed: %v\n", file, err)
- }
- }
- }
- }
-
- return nil
-}
-
-// getInputFiles returns all input files located in specified directory
-func getInputFiles(inputDir string, deep int) (files []string, err error) {
- entries, err := ioutil.ReadDir(inputDir)
- if err != nil {
- return nil, fmt.Errorf("reading directory %s failed: %v", inputDir, err)
- }
- for _, e := range entries {
- if e.IsDir() && deep > 0 {
- nestedDir := filepath.Join(inputDir, e.Name())
- if nested, err := getInputFiles(nestedDir, deep-1); err != nil {
- return nil, err
- } else {
- files = append(files, nested...)
- }
- } else if strings.HasSuffix(e.Name(), inputFileExt) {
- files = append(files, filepath.Join(inputDir, e.Name()))
- }
- }
- return files, nil
-}
-
-func parseInputJSON(inputData []byte) (*jsongo.Node, error) {
- jsonRoot := new(jsongo.Node)
- if err := json.Unmarshal(inputData, jsonRoot); err != nil {
- return nil, fmt.Errorf("unmarshalling JSON failed: %v", err)
- }
- return jsonRoot, nil
-}
-
-// generateFromFile generates Go package from one input JSON file
-func generateFromFile(inputFile, outputDir string, typesPkgs []*context) error {
- // create generator context
- ctx, err := newContext(inputFile, outputDir)
- if err != nil {
- return err
- }
-
- logf("------------------------------------------------------------")
- logf("module: %s", ctx.moduleName)
- logf(" - input: %s", ctx.inputFile)
- logf(" - output: %s", ctx.outputFile)
- logf("------------------------------------------------------------")
-
- // prepare options
- ctx.includeAPIVersion = *includeAPIVer
- ctx.includeComments = *includeComments
- ctx.includeBinapiNames = *includeBinapiNames
- ctx.includeServices = *includeServices
-
- // read API definition from input file
- ctx.inputData, err = ioutil.ReadFile(ctx.inputFile)
- if err != nil {
- return fmt.Errorf("reading input file %s failed: %v", ctx.inputFile, err)
- }
- // parse JSON data into objects
- jsonRoot, err := parseInputJSON(ctx.inputData)
- if err != nil {
- return fmt.Errorf("parsing JSON input failed: %v", err)
- }
- ctx.packageData, err = parsePackage(ctx, jsonRoot)
- if err != nil {
- return fmt.Errorf("parsing package %s failed: %v", ctx.packageName, err)
- }
-
- if len(typesPkgs) > 0 {
- err = loadTypeAliases(ctx, typesPkgs)
- if err != nil {
- return fmt.Errorf("loading type aliases failed: %v", err)
- }
- }
-
- // generate Go package code
- var buf bytes.Buffer
- if err := generatePackage(ctx, &buf); err != nil {
- return fmt.Errorf("generating code for package %s failed: %v", ctx.packageName, err)