github.com/thetreep/go-swagger@v0.0.0-20240223100711-35af64f14f01/cmd/swagger/commands/expand.go (about) 1 package commands 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "log" 8 "os" 9 10 "github.com/go-openapi/loads" 11 "github.com/go-openapi/spec" 12 "github.com/go-openapi/swag" 13 flags "github.com/jessevdk/go-flags" 14 ) 15 16 // ExpandSpec is a command that expands the $refs in a swagger document. 17 // 18 // There are no specific options for this expansion. 19 type ExpandSpec struct { 20 Compact bool `long:"compact" description:"applies to JSON formatted specs. When present, doesn't prettify the json"` 21 Output flags.Filename `long:"output" short:"o" description:"the file to write to"` 22 Format string `long:"format" description:"the format for the spec document" default:"json" choice:"yaml" choice:"json"` 23 } 24 25 // Execute expands the spec 26 func (c *ExpandSpec) Execute(args []string) error { 27 if len(args) != 1 { 28 return errors.New("expand command requires the single swagger document url to be specified") 29 } 30 31 swaggerDoc := args[0] 32 specDoc, err := loads.Spec(swaggerDoc) 33 if err != nil { 34 return err 35 } 36 37 exp, err := specDoc.Expanded() 38 if err != nil { 39 return err 40 } 41 42 return writeToFile(exp.Spec(), !c.Compact, c.Format, string(c.Output)) 43 } 44 45 func writeToFile(swspec *spec.Swagger, pretty bool, format string, output string) error { 46 var b []byte 47 var err error 48 asJSON := format == "json" 49 50 log.Println("format = ", format) 51 switch { 52 case pretty && asJSON: 53 b, err = json.MarshalIndent(swspec, "", " ") 54 case asJSON: 55 b, err = json.Marshal(swspec) 56 default: 57 // marshals as YAML 58 b, err = json.Marshal(swspec) 59 if err == nil { 60 var data swag.JSONMapSlice 61 if erg := json.Unmarshal(b, &data); erg != nil { 62 log.Fatalln(erg) 63 } 64 var bb interface{} 65 bb, err = data.MarshalYAML() 66 if err == nil { 67 b = bb.([]byte) 68 } 69 } 70 } 71 72 if err != nil { 73 return err 74 } 75 76 if output == "" { 77 fmt.Println(string(b)) 78 return nil 79 } 80 81 return os.WriteFile(output, b, 0644) // #nosec 82 }