github.com/grafana/pyroscope@v1.18.0/tools/api-docs-generator/curl.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "io" 8 9 "github.com/getkin/kin-openapi/openapi3" 10 ) 11 12 type shellCmd string 13 14 func (c shellCmd) MarshalJSON() ([]byte, error) { 15 return json.Marshal(`#` + string(c) + `#`) 16 } 17 18 type exampleCurl struct { 19 sc *openapi3.Schema 20 } 21 22 func newExampleCurl(sc *openapi3.Schema) *exampleCurl { 23 return &exampleCurl{sc: sc} 24 } 25 26 func (e *exampleCurl) name() string { 27 return "curl" 28 } 29 30 func (e *exampleCurl) render(sb io.Writer, params *exampleParams) { 31 body := map[string]any{} 32 collectParameters(e.sc, "", func(prefix string, name string, schema *openapi3.Schema) { 33 exStr, exValue := getExample(schema) 34 if exStr == "" { 35 return 36 } 37 38 ex, ok := exampleParameters[exStr] 39 if !ok || ex.Curl == nil { 40 setBody(body, prefix, name, exValue) 41 return 42 } 43 44 setBody(body, prefix, name, ex.Curl) 45 }) 46 47 addLabelsToSeries(body, "__name__", "process_cpu") 48 bodyJson, err := json.MarshalIndent(&body, " ", " ") 49 if err != nil { 50 panic(err) 51 } 52 53 // convert commands so they are run in bash 54 bodyJson = bytes.ReplaceAll(bodyJson, []byte{'"', '#', '\\', '"'}, []byte{'"', '\''}) 55 bodyJson = bytes.ReplaceAll(bodyJson, []byte{'\\', '"', '#', '"'}, []byte{'\'', '"'}) 56 bodyJson = bytes.ReplaceAll(bodyJson, []byte{'#', '"'}, []byte{'\''}) 57 bodyJson = bytes.ReplaceAll(bodyJson, []byte{'"', '#'}, []byte{'\''}) 58 59 fmt.Fprintln(sb, "curl \\") 60 fmt.Fprintln(sb, ` -H "Content-Type: application/json" \`) 61 fmt.Fprint(sb, " -d '") 62 fmt.Fprint(sb, string(bodyJson)) 63 fmt.Fprintln(sb, "' \\") 64 fmt.Fprintf(sb, " %s\n", params.url) 65 66 }