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 ",
Short: "Generate Go code from a given input file",
Long: `Generate Go code from a given input file, where 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")
}
log.Infof("API: %v, %v", api.Info.Title, api.Info.Version)
log.Info("Paths:")
for k, _ := range api.Paths {
log.Infof(" - %v", k)
for m, n := range api.Paths[k].Operations() {
log.Infof( " [%v] %v: %v", m, n.OperationId, n.Summary)
}
}
os.Mkdir(packageName, 0755)
os.Mkdir(path.Join(packageName, "schema"), 0755)
tEnc := encode.NewEncoder(packageName)
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, k + ".go"), []byte(tData[:]) ,0644)
if err != nil {
log.WithError(err).Fatal("cannot create file")
}
}
return nil
}