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 }