github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/cmd/internal/svc/codegen/httpiclient.go (about)

     1  package codegen
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"github.com/sirupsen/logrus"
     7  	"github.com/unionj-cloud/go-doudou/cmd/internal/astutils"
     8  	"github.com/unionj-cloud/go-doudou/toolkit/copier"
     9  	"github.com/unionj-cloud/go-doudou/version"
    10  	"os"
    11  	"path/filepath"
    12  	"strings"
    13  	"text/template"
    14  )
    15  
    16  var iclientTmpl = `/**
    17  * Generated by go-doudou {{.Version}}.
    18  * Don't edit!
    19  */
    20  package client
    21  
    22  import (
    23  	"context"
    24  	"github.com/go-resty/resty/v2"
    25  	"{{.VoPackage}}"
    26  	v3 "github.com/unionj-cloud/go-doudou/toolkit/openapi/v3"
    27  	"os"
    28  )
    29  
    30  type I{{.Meta.Name}}Client interface {
    31  {{- range $m := .Meta.Methods }}
    32  	{{$m.Name}}(ctx context.Context, _headers map[string]string, {{- range $i, $p := $m.Params}}
    33  	{{- if ne $p.Type "context.Context" }}
    34  	{{- $p.Name}} {{$p.Type}},
    35  	{{- end }}
    36      {{- end }}) (_resp *resty.Response, {{- range $i, $r := $m.Results}}
    37                       {{- if $i}},{{end}}
    38                       {{- $r.Name}} {{$r.Type}}
    39                       {{- end }})
    40  {{- end }}
    41  }
    42  `
    43  
    44  // GenGoIClient generates golang http client interface code from result of parsing svc.go file in project root path
    45  func GenGoIClient(dir string, ic astutils.InterfaceCollector) {
    46  	var (
    47  		err        error
    48  		clientfile string
    49  		f          *os.File
    50  		tpl        *template.Template
    51  		sqlBuf     bytes.Buffer
    52  		clientDir  string
    53  		fi         os.FileInfo
    54  		source     string
    55  		modfile    string
    56  		modName    string
    57  		firstLine  string
    58  		modf       *os.File
    59  		meta       astutils.InterfaceMeta
    60  	)
    61  	clientDir = filepath.Join(dir, "client")
    62  	if err = os.MkdirAll(clientDir, os.ModePerm); err != nil {
    63  		panic(err)
    64  	}
    65  
    66  	clientfile = filepath.Join(clientDir, "iclient.go")
    67  	fi, err = os.Stat(clientfile)
    68  	if err != nil && !os.IsNotExist(err) {
    69  		panic(err)
    70  	}
    71  	if fi != nil {
    72  		logrus.Warningln("file iclient.go will be overwritten")
    73  	}
    74  	if f, err = os.Create(clientfile); err != nil {
    75  		panic(err)
    76  	}
    77  	defer f.Close()
    78  
    79  	err = copier.DeepCopy(ic.Interfaces[0], &meta)
    80  	if err != nil {
    81  		panic(err)
    82  	}
    83  
    84  	modfile = filepath.Join(dir, "go.mod")
    85  	if modf, err = os.Open(modfile); err != nil {
    86  		panic(err)
    87  	}
    88  	reader := bufio.NewReader(modf)
    89  	firstLine, _ = reader.ReadString('\n')
    90  	modName = strings.TrimSpace(strings.TrimPrefix(firstLine, "module"))
    91  
    92  	if tpl, err = template.New("iclient.go.tmpl").Parse(iclientTmpl); err != nil {
    93  		panic(err)
    94  	}
    95  	if err = tpl.Execute(&sqlBuf, struct {
    96  		VoPackage string
    97  		Meta      astutils.InterfaceMeta
    98  		Version   string
    99  	}{
   100  		VoPackage: modName + "/vo",
   101  		Meta:      meta,
   102  		Version:   version.Release,
   103  	}); err != nil {
   104  		panic(err)
   105  	}
   106  
   107  	source = strings.TrimSpace(sqlBuf.String())
   108  	astutils.FixImport([]byte(source), clientfile)
   109  }