github.com/emreu/go-swagger@v0.22.1/generator/client.go (about)

     1  // Copyright 2015 go-swagger maintainers
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //    http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package generator
    16  
    17  import (
    18  	"encoding/json"
    19  	"errors"
    20  	"fmt"
    21  	"os"
    22  	"path"
    23  	"path/filepath"
    24  	"sort"
    25  
    26  	"github.com/go-openapi/analysis"
    27  	"github.com/go-openapi/runtime"
    28  	"github.com/go-openapi/swag"
    29  )
    30  
    31  // GenerateClient generates a client library for a swagger spec document.
    32  func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpts) error {
    33  	templates.LoadDefaults()
    34  	if opts == nil {
    35  		return errors.New("gen opts are required")
    36  	}
    37  
    38  	if opts.Template != "" {
    39  		if err := templates.LoadContrib(opts.Template); err != nil {
    40  			return err
    41  		}
    42  	}
    43  
    44  	templates.SetAllowOverride(opts.AllowTemplateOverride)
    45  
    46  	if opts.TemplateDir != "" {
    47  		if err := templates.LoadDir(opts.TemplateDir); err != nil {
    48  			return err
    49  		}
    50  	}
    51  
    52  	if err := opts.CheckOpts(); err != nil {
    53  		return err
    54  	}
    55  
    56  	// Load the spec
    57  	_, specDoc, err := loadSpec(opts.Spec)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	// Validate and Expand. specDoc is in/out param.
    63  	specDoc, err = validateAndFlattenSpec(opts, specDoc)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	analyzed := analysis.New(specDoc.Spec())
    69  
    70  	models, err := gatherModels(specDoc, modelNames)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	operations := gatherOperations(analyzed, operationIDs)
    76  
    77  	if len(operations) == 0 {
    78  		return errors.New("no operations were selected")
    79  	}
    80  
    81  	defaultScheme := opts.DefaultScheme
    82  	if defaultScheme == "" {
    83  		defaultScheme = sHTTP
    84  	}
    85  
    86  	defaultConsumes := opts.DefaultConsumes
    87  	if defaultConsumes == "" {
    88  		defaultConsumes = runtime.JSONMime
    89  	}
    90  
    91  	defaultProduces := opts.DefaultProduces
    92  	if defaultProduces == "" {
    93  		defaultProduces = runtime.JSONMime
    94  	}
    95  
    96  	generator := appGenerator{
    97  		Name:              appNameOrDefault(specDoc, name, "rest"),
    98  		SpecDoc:           specDoc,
    99  		Analyzed:          analyzed,
   100  		Models:            models,
   101  		Operations:        operations,
   102  		Target:            opts.Target,
   103  		DumpData:          opts.DumpData,
   104  		Package:           opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"),
   105  		APIPackage:        opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"),
   106  		ModelsPackage:     opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"),
   107  		ServerPackage:     opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"),
   108  		ClientPackage:     opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
   109  		OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"),
   110  		Principal:         opts.Principal,
   111  		DefaultScheme:     defaultScheme,
   112  		DefaultProduces:   defaultProduces,
   113  		DefaultConsumes:   defaultConsumes,
   114  		GenOpts:           opts,
   115  	}
   116  	generator.Receiver = "o"
   117  	return (&clientGenerator{generator}).Generate()
   118  }
   119  
   120  type clientGenerator struct {
   121  	appGenerator
   122  }
   123  
   124  func (c *clientGenerator) Generate() error {
   125  	app, err := c.makeCodegenApp()
   126  	if app.Name == "" {
   127  		app.Name = "APIClient"
   128  	}
   129  	baseImport := c.GenOpts.LanguageOpts.baseImport(c.Target)
   130  
   131  	if c.GenOpts.ExistingModels == "" {
   132  		if app.Imports == nil {
   133  			app.Imports = make(map[string]string)
   134  		}
   135  		pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models")
   136  		app.Imports[pkgAlias] = path.Join(
   137  			filepath.ToSlash(baseImport),
   138  			c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models"))
   139  	} else {
   140  		app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, ""))
   141  	}
   142  	if err != nil {
   143  		return err
   144  	}
   145  
   146  	if c.DumpData {
   147  		bb, _ := json.MarshalIndent(swag.ToDynamicJSON(app), "", "  ")
   148  		fmt.Fprintln(os.Stdout, string(bb))
   149  		return nil
   150  	}
   151  
   152  	if c.GenOpts.IncludeModel {
   153  		for _, mod := range app.Models {
   154  			modCopy := mod
   155  			modCopy.IncludeValidator = true
   156  			if !mod.IsStream {
   157  				if err := c.GenOpts.renderDefinition(&modCopy); err != nil {
   158  					return err
   159  				}
   160  			}
   161  		}
   162  	}
   163  
   164  	if c.GenOpts.IncludeHandler {
   165  		sort.Sort(app.OperationGroups)
   166  		for i := range app.OperationGroups {
   167  			opGroup := app.OperationGroups[i]
   168  			opGroup.DefaultImports = app.DefaultImports
   169  			opGroup.RootPackage = c.ClientPackage
   170  			opGroup.GenOpts = c.GenOpts
   171  			app.OperationGroups[i] = opGroup
   172  			sort.Sort(opGroup.Operations)
   173  			for _, op := range opGroup.Operations {
   174  				opCopy := op
   175  				if opCopy.Package == "" {
   176  					opCopy.Package = c.Package
   177  				}
   178  				if err := c.GenOpts.renderOperation(&opCopy); err != nil {
   179  					return err
   180  				}
   181  			}
   182  			app.DefaultImports = append(app.DefaultImports,
   183  				path.Join(
   184  					filepath.ToSlash(baseImport),
   185  					c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"),
   186  					opGroup.Name))
   187  
   188  			if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil {
   189  				return err
   190  			}
   191  		}
   192  	}
   193  
   194  	if c.GenOpts.IncludeSupport {
   195  		if err := c.GenOpts.renderApplication(&app); err != nil {
   196  			return err
   197  		}
   198  	}
   199  
   200  	return nil
   201  }