github.com/vyskocilm/postkid/builder@v0.0.0-20191001131220-20c88b283fad/go.go (about) 1 package builder 2 3 // generate go client boilerplate which can perform the request 4 5 import ( 6 "fmt" 7 "text/template" 8 ) 9 10 type goVars struct { 11 Method string 12 CreateBodyReader string 13 BodyReader string 14 Query map[string]string 15 } 16 17 // Go returns go snippet calling the url 18 func (b *Builder) Go(req *Request) error { 19 20 const goTemplate = ` 21 package main 22 23 import ( 24 "context" 25 "net/http" 26 "strings" 27 ) 28 29 func main() { 30 31 ctx := context.Background() 32 {{ .CreateBodyReader }} 33 req, err := http.NewRequestWithContext( 34 ctx, 35 {{ .Method }}, 36 {{ .BodyReader }}, 37 ) 38 if err != nil { 39 log.Fatal(err) 40 } 41 {{ range $name, $value := .Query }} 42 req.Header.Add("{{ $name }}", "{{ $value }}") 43 {{ end }} 44 tr := &http.Transport{ 45 MaxIdleConns: 10, 46 IdleConnTimeout: 30 * time.Second, 47 DisableCompression: false, 48 } 49 client := &http.Client{Transport: tr} 50 51 resp, err := client.Do(req) 52 if err != nil { 53 log.Fatal(err) 54 } 55 log.Printf("resp=%+v", resp) 56 57 }` 58 59 bodyReader := "nil" 60 createBodyReader := "\n" 61 if req.Method == "POST" || req.Method == "PUT" { 62 createBodyReader = fmt.Sprintf("body := strings.NewReader(`%s`)", req.Body) 63 bodyReader = "body" 64 } 65 66 foo := goVars{ 67 Method: req.Method, 68 BodyReader: bodyReader, 69 CreateBodyReader: createBodyReader, 70 Query: req.Query, 71 } 72 // Create a new template and parse the letter into it. 73 t, err := template.New("go").Parse(goTemplate) 74 75 if err != nil { 76 return err 77 } 78 79 err = t.Execute(b.w, foo) 80 if err != nil { 81 return err 82 } 83 84 return nil 85 }