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") } // 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 }