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  }