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  }