github.com/profzone/eden-framework@v1.0.10/internal/generator/files/client.go (about)

     1  package files
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/profzone/eden-framework/internal/generator/api"
     7  	"github.com/profzone/eden-framework/internal/generator/importer"
     8  	str "github.com/profzone/eden-framework/pkg/strings"
     9  	"github.com/sirupsen/logrus"
    10  	"io"
    11  	"strings"
    12  )
    13  
    14  type ClientFile struct {
    15  	ClientName  string
    16  	PackageName string
    17  	Name        string
    18  	Importer    *importer.PackageImporter
    19  	a           *api.Api
    20  }
    21  
    22  func NewClientFile(name string, a *api.Api) *ClientFile {
    23  	return &ClientFile{
    24  		Name:        str.ToLowerLinkCase(name),
    25  		PackageName: str.ToLowerSnakeCase("client-" + name),
    26  		ClientName:  str.ToUpperCamelCase("client-" + name),
    27  		Importer:    importer.NewPackageImporter(""),
    28  		a:           a,
    29  	}
    30  }
    31  
    32  func (c *ClientFile) WritePackage(w io.Writer) (err error) {
    33  	_, err = io.WriteString(w, fmt.Sprintf("package %s\n\n", c.PackageName))
    34  	return
    35  }
    36  
    37  func (c *ClientFile) WriteImports(w io.Writer) (err error) {
    38  	_, err = io.WriteString(w, c.Importer.String())
    39  	return
    40  }
    41  
    42  func (c *ClientFile) WriteTypeInterface(w io.Writer) (err error) {
    43  	_, err = io.WriteString(w, fmt.Sprintf("type %sInterface interface {\n", c.ClientName))
    44  	if err != nil {
    45  		return err
    46  	}
    47  	for groupName, group := range c.a.Operators {
    48  		for methodName, method := range group.Methods {
    49  			req, resp := make([]string, 0), make([]string, 0)
    50  			var typeName string
    51  			for _, modelName := range method.Inputs {
    52  				model, ok := c.a.Models[modelName]
    53  				if !ok {
    54  					logrus.Panic(fmt.Errorf("%s not exist in model definations", modelName))
    55  				}
    56  				if model.NeedAlias {
    57  					typeName = c.Importer.Use(modelName)
    58  				} else {
    59  					typeName = model.Name
    60  				}
    61  				req = append(req, fmt.Sprintf("%s *%s", str.ToLowerCamelCase(model.Name), typeName))
    62  			}
    63  			for _, modelName := range method.Outputs {
    64  				model, ok := c.a.Models[modelName]
    65  				if !ok {
    66  					logrus.Panic(fmt.Errorf("%s not exist in model definations", modelName))
    67  				}
    68  				if model.NeedAlias {
    69  					typeName = c.Importer.Use(modelName)
    70  				} else {
    71  					typeName = model.Name
    72  				}
    73  				resp = append(resp, fmt.Sprintf("%s *%s", str.ToLowerCamelCase(model.Name), typeName))
    74  			}
    75  			resp = append(resp, "err error")
    76  			methodString := fmt.Sprintf("%s(%s) (%s)\n", str.ToUpperCamelCase(groupName+methodName), strings.Join(req, ", "), strings.Join(resp, ", "))
    77  			_, err = io.WriteString(w, methodString)
    78  			if err != nil {
    79  				return err
    80  			}
    81  		}
    82  	}
    83  
    84  	_, err = io.WriteString(w, "}\n")
    85  	return
    86  }
    87  
    88  func (c *ClientFile) WriteClientGeneral(w io.Writer) (err error) {
    89  	typeDef := `type ` + c.ClientName + ` struct {
    90  	` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.PeerConfig") + `
    91  	peer       ` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.Peer") + `
    92  	session    ` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.Session") + `
    93  	RemoteAddr string` + " `yaml:\"remoteAddr\" ini:\"remoteAddr\" comment:\"Remote address with port\"`" + `
    94  }
    95  
    96  func (c *` + c.ClientName + `) Init() {
    97  	c.peer = ` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.NewPeer") + `(c.PeerConfig)
    98  
    99  	var stat *` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.Status") + `
   100  	c.session, stat = c.peer.Dial(c.RemoteAddr)
   101  	if !stat.OK() {
   102  		panic(` + c.Importer.Use("fmt.Errorf") + `("connection err, status: %v", stat.String()))
   103  	}
   104  }
   105  
   106  func (c *` + c.ClientName + `) DockerDefaults() map[string]string {
   107  	return map[string]string{}
   108  }
   109  
   110  func (c *` + c.ClientName + `) RegisterCallRouter(route interface{}, plugins ...` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.Plugin") + `) []string {
   111  	return c.peer.RouteCall(route, plugins...)
   112  }
   113  
   114  func (c *` + c.ClientName + `) RegisterPushRouter(route interface{}, plugins ...` + c.Importer.Use("github.com/henrylee2cn/erpc/v6.Plugin") + `) []string {
   115  	return c.peer.RoutePush(route, plugins...)
   116  }
   117  
   118  `
   119  
   120  	_, err = io.WriteString(w, typeDef)
   121  	return
   122  }
   123  
   124  func (c *ClientFile) WriteMethods(w io.Writer) (err error) {
   125  	var methodsDef string
   126  	c.a.WalkOperators(func(g *api.OperatorGroup) {
   127  		g.WalkMethods(func(m *api.OperatorMethod) {
   128  			req, resp := make([][]string, 0), make([][]string, 0)
   129  			var typeName string
   130  			m.WalkInputs(func(i string) {
   131  				model, ok := c.a.Models[i]
   132  				if !ok {
   133  					logrus.Panic(fmt.Errorf("%s not exist in model definations", i))
   134  				}
   135  				if model.NeedAlias {
   136  					typeName = c.Importer.Use(i)
   137  				} else {
   138  					typeName = model.Name
   139  				}
   140  				req = append(req, []string{str.ToLowerCamelCase(model.Name), "*" + typeName})
   141  			})
   142  			m.WalkOutputs(func(i string) {
   143  				model, ok := c.a.Models[i]
   144  				if !ok {
   145  					logrus.Panic(fmt.Errorf("%s not exist in model definations", i))
   146  				}
   147  				if model.NeedAlias {
   148  					typeName = c.Importer.Use(i)
   149  				} else {
   150  					typeName = model.Name
   151  				}
   152  				resp = append(resp, []string{str.ToLowerCamelCase(model.Name), "*" + typeName})
   153  			})
   154  			resp = append(resp, []string{"err", "error"})
   155  
   156  			var requestStr string
   157  			if len(req) == 0 {
   158  				requestStr = "nil"
   159  			} else {
   160  				requestStr = req[0][0]
   161  			}
   162  			if !g.IsPush {
   163  				methodsDef += `func (c *` + c.ClientName + `) ` + strings.Join([]string{g.Name, m.Name}, "") + `(` + str.RecursiveJoin(req, " ", ", ") + `) (` + str.RecursiveJoin(resp, " ", ", ") + `) {
   164  	stat := c.session.Call("` + strings.Join([]string{g.Path, m.Path}, "") + `", ` + requestStr + `, &` + resp[0][0] + `).Status()
   165  	if !stat.OK() {
   166  		err = stat.Cause()
   167  	}
   168  	return
   169  }
   170  
   171  `
   172  			} else {
   173  				methodsDef += `func (c *` + c.ClientName + `) ` + strings.Join([]string{g.Name, m.Name}, "") + `(` + str.RecursiveJoin(req, " ", ", ") + `) (err error) {
   174  	stat := c.session.Push("` + strings.Join([]string{g.Path, m.Path}, "") + `", ` + requestStr + `)
   175  	if !stat.OK() {
   176  		err = stat.Cause()
   177  	}
   178  	return
   179  }
   180  
   181  `
   182  			}
   183  		})
   184  	})
   185  
   186  	_, err = io.WriteString(w, methodsDef)
   187  	return
   188  }
   189  
   190  func (c *ClientFile) WriteAll() string {
   191  	w := bytes.NewBuffer([]byte{})
   192  	err := c.WriteTypeInterface(w)
   193  	if err != nil {
   194  		logrus.Panic(err)
   195  	}
   196  
   197  	err = c.WriteClientGeneral(w)
   198  	if err != nil {
   199  		logrus.Panic(err)
   200  	}
   201  
   202  	err = c.WriteMethods(w)
   203  	if err != nil {
   204  		logrus.Panic(err)
   205  	}
   206  
   207  	return w.String()
   208  }
   209  
   210  func (c *ClientFile) String() string {
   211  	buf := bytes.NewBuffer([]byte{})
   212  
   213  	content := c.WriteAll()
   214  
   215  	err := c.WritePackage(buf)
   216  	if err != nil {
   217  		logrus.Panic(err)
   218  	}
   219  
   220  	err = c.WriteImports(buf)
   221  	if err != nil {
   222  		logrus.Panic(err)
   223  	}
   224  
   225  	_, err = io.WriteString(buf, content)
   226  	if err != nil {
   227  		logrus.Panic(err)
   228  	}
   229  
   230  	return buf.String()
   231  }