135 lines
3.3 KiB
Go
135 lines
3.3 KiB
Go
package cmd // import "udico.de/uditaren/opier/cmd"
|
|
import (
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/spf13/cobra"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
"udico.de/opier/encode"
|
|
"udico.de/opier/openapi"
|
|
)
|
|
|
|
var cGenerate = &cobra.Command{
|
|
Use: "generate <input>",
|
|
Short: "Generate Go code from a given input file",
|
|
Long: `Generate Go code from a given input file, where <input> can either be a local
|
|
or a remote file (when starting with http(s)://)`,
|
|
|
|
Args: cobra.ExactArgs(1),
|
|
}
|
|
|
|
var packageName = "api"
|
|
|
|
func init() {
|
|
cGenerate.RunE = executeGenerate
|
|
cGenerate.PersistentFlags().StringVarP(&packageName, "package", "p","api", "The name of the generated package")
|
|
|
|
cRoot.AddCommand(cGenerate)
|
|
}
|
|
|
|
func executeGenerate(cmd *cobra.Command, args []string) error {
|
|
log.WithField("input", args[0]).Debugf("Generate Go code")
|
|
|
|
api, err := openapi.Load(args[0])
|
|
if err != nil {
|
|
log.WithError(err).Fatal("cannot load input data")
|
|
}
|
|
|
|
// path
|
|
// - parametres
|
|
// - methods
|
|
// - parameters
|
|
// - body
|
|
// - response
|
|
|
|
ops := make(map[string/*tag*/][]*openapi.Operation)
|
|
|
|
log.Infof("API: %v, %v", api.Info.Title, api.Info.Version)
|
|
log.Info("Paths:")
|
|
for k, v := range api.Paths {
|
|
name := k
|
|
log.Infof(" - %v", name)
|
|
for m, n := range v.Operations() {
|
|
v.Name = k
|
|
tag := ""
|
|
if len(n.Tags) > 0 {
|
|
tag = n.Tags[0]
|
|
}
|
|
log.Infof( " [%v] %v: %v", m, n.OperationId, n.Summary)
|
|
//if len(ops[tag])==0 {
|
|
// ops[tag]= make([]*openapi.Operation)
|
|
//}
|
|
ops[tag] = append(ops[tag], n)
|
|
}
|
|
}
|
|
|
|
os.Mkdir(packageName, 0755)
|
|
//os.Mkdir(path.Join(packageName, "model"), 0755)
|
|
tEnc := encode.NewEncoder(packageName, api)
|
|
|
|
/// schema
|
|
log.Info("Types:")
|
|
for k, v := range api.Components.Schemas {
|
|
log.Infof("File: %v.go", strings.ToLower(k))
|
|
tData := ""
|
|
switch v.Type {
|
|
case "array":
|
|
//log.Infof(" [%v]", v.Items.TypeOrReference())
|
|
tData = tEnc.Array(k, v)
|
|
|
|
case "object", "":
|
|
tData = tEnc.Object(k, v)
|
|
|
|
default:
|
|
if len(v.Enum) > 0 {
|
|
tData = tEnc.Enum(k, v)
|
|
} else {
|
|
log.Warnf("UNKNOWN TYPE!!! %v , %v", k, v.Type)
|
|
}
|
|
}
|
|
if tData == "" {
|
|
log.Warnf("no data in %v", k)
|
|
continue
|
|
}
|
|
err = ioutil.WriteFile(path.Join(packageName, "model_" + k + ".go"), []byte(tData[:]) ,0644)
|
|
if err != nil {
|
|
log.WithError(err).Fatal("cannot create file")
|
|
}
|
|
}
|
|
|
|
log.Info("Parameters:")
|
|
for k, v := range api.Components.Parameters {
|
|
log.Infof(" - %v (%v) [%v]: %v", k, v.In, v.Schema.GoType(), v.Description)
|
|
}
|
|
|
|
log.Info("Paths again:")
|
|
for tag, v := range ops {
|
|
log.Infof("tag: %v", tag)
|
|
for method, op := range v {
|
|
log.Infof(" - [%v]%v: %v", method, op.OperationId, op.Summary)
|
|
log.Infof(" %v", op.Path().Name)
|
|
for _, p := range op.Path().Parameters {
|
|
log.Infof(" %v", p.Ref)
|
|
}
|
|
for _, p := range op.Parameters {
|
|
log.Infof(" %v: %v", p.In, p.Name)
|
|
}
|
|
}
|
|
tData := tEnc.Funcs(tag, v)
|
|
log.Infof("%v.go: %v", tag, tData)
|
|
err = ioutil.WriteFile(path.Join(packageName, "api_" + tag + ".go"), []byte(tData[:]) ,0644)
|
|
if err != nil {
|
|
log.WithError(err).Fatal("cannot create file")
|
|
}
|
|
}
|
|
|
|
log.Info("writing api.go")
|
|
err = ioutil.WriteFile(path.Join(packageName, "api.go"), []byte(tEnc.Api(*api.Servers[0])[:]) ,0644)
|
|
if err != nil {
|
|
log.WithError(err).Fatal("cannot create file")
|
|
}
|
|
|
|
return nil
|
|
}
|