github.com/alimy/mir/v4@v4.1.0/internal/generator/templates/gin_iface.tmpl (about) 1 // Code generated by go-mir. DO NOT EDIT. 2 // versions: 3 // - mir {{ .VerInfo.MirVer }} 4 5 package {{ .PkgName }} 6 7 import ( 8 "net/http" 9 10 "github.com/alimy/mir/v4" 11 {{if notEmptyStr .EngineInfo.PkgName }}gin "{{ .EngineInfo.PkgName }}{{else}}"github.com/gin-gonic/gin{{end}}" 12 {{ declareImports .Imports }} 13 ) 14 {{- if .DeclareCoreInterface }} 15 type _binding_ interface { 16 Bind(*gin.Context) mir.Error 17 } 18 19 type _render_ interface { 20 Render(*gin.Context) 21 } 22 23 type _default_ interface { 24 Bind(*gin.Context, any) mir.Error 25 Render(*gin.Context, any, mir.Error) 26 } 27 {{- end }} 28 29 {{ declareTypes .InOuts .PkgPath .Imports }} 30 31 {{if notEmptyStr .Comment }}// {{.Comment}}{{end}} 32 type {{.TypeName}} interface { 33 _default_ 34 35 {{if notEmptyStr .Chain }}// Chain provide handlers chain for gin 36 {{.Chain}}() gin.HandlersChain 37 {{end}} 38 {{range .Fields}} {{if .JustUseContext }}{{ .MethodName}}(*gin.Context){{else}}{{.MethodName}}({{if .IsUseContext }}*gin.Context{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName }}*{{ .InName }}{{end}}) {{if notEmptyStr .OutName }}(*{{ .OutName}}, mir.Error){{else}}mir.Error{{end}}{{end}} 39 {{end}} 40 41 mustEmbedUnimplemented{{.TypeName}}Servant() 42 } 43 {{if .IsUseFieldChain }} 44 type {{.TypeName}}Chain interface { 45 {{range .ChainFields }} Chain{{.MethodName}}() gin.HandlersChain 46 {{end}} 47 48 mustEmbedUnimplemented{{.TypeName}}Chain() 49 } 50 {{end}} 51 52 // Register{{.TypeName}}Servant register {{.TypeName}} servant to gin 53 func Register{{.TypeName}}Servant(e *gin.Engine, s {{.TypeName}}{{if .IsUseFieldChain }}, m ...{{.TypeName}}Chain{{end}}) { 54 {{- if .IsUseFieldChain -}} 55 var cc {{.TypeName}}Chain 56 if len(m) > 0 { 57 cc = m[0] 58 } else { 59 cc = &Unimplemented{{.TypeName}}Chain{} 60 } 61 {{- end}} 62 {{if notEmptyStr .Group }} router := e.Group("{{.Group}}"){{else}} router := e{{end}} 63 {{if notEmptyStr .Chain }} // use chain for router 64 middlewares := s.{{.Chain}}() 65 router.Use(middlewares...) 66 {{end}} 67 // register routes info to router 68 {{range .Fields}}{{if .NotHttpAny }} router.Handle("{{.HttpMethod}}", "{{.Path}}", {{if .IsFieldChain }}append(cc.Chain{{.MethodName}}(), {{end}}{{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(c *gin.Context) { 69 {{- if $.WatchCtxDone }} 70 select { 71 case <- c.Request.Context().Done(): 72 return 73 default: 74 } 75 {{end -}} 76 {{if notEmptyStr .InName -}} 77 req := new({{.InName}}) 78 {{if .IsBindIn -}} 79 var bv _binding_ = req 80 if err := bv.Bind(c); err != nil { 81 {{- else -}} 82 if err := s.Bind(c, req); err != nil { 83 {{- end }} 84 s.Render(c, nil, err) 85 return 86 } 87 {{- end }} 88 {{if notEmptyStr .OutName -}} 89 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName }}req{{end}}) 90 {{if .IsRenderOut -}} 91 if err != nil { 92 s.Render(c, nil, err) 93 return 94 } 95 var rv _render_ = resp 96 rv.Render(c) 97 {{- else -}} 98 s.Render(c, resp, err) 99 {{- end }} 100 {{- else -}} 101 s.Render(c, nil, s.{{.MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 102 {{- end }} 103 }{{end}}{{if .IsFieldChain }})...{{end}}) 104 {{else if .JustHttpAny}} router.Any("{{.Path}}", {{if .IsFieldChain }}append(cc.Chain{{.MethodName}}(), {{end}}{{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(c *gin.Context) { 105 {{- if $.WatchCtxDone }} 106 select { 107 case <- c.Request.Context().Done(): 108 return 109 default: 110 } 111 {{end -}} 112 {{if notEmptyStr .InName -}} 113 req := new({{.InName}}) 114 {{if .IsBindIn -}} 115 var bv _binding_ = req 116 if err := bv.Bind(c); err != nil { 117 {{- else -}} 118 if err := s.Bind(c, req); err != nil { 119 {{- end }} 120 s.Render(c, nil, err) 121 return 122 } 123 {{- end }} 124 {{if notEmptyStr .OutName -}} 125 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}}) 126 {{if .IsRenderOut -}} 127 if err != nil { 128 s.Render(c, nil, err) 129 return 130 } 131 var rv _render_ = resp 132 rv.Render(c) 133 {{- else -}} 134 s.Render(c, resp, err) 135 {{- end }} 136 {{- else -}} 137 s.Render(c, nil, s.{{.MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 138 {{- end }} 139 }{{end}}{{if .IsFieldChain }})...{{end}}) 140 {{else}}{{$field := .}} { 141 h := {{if .IsFieldChain }}append(cc.Chain{{.MethodName}}(), {{end}}{{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(c *gin.Context) { 142 {{- if $.WatchCtxDone }} 143 select { 144 case <- c.Request.Context().Done(): 145 return 146 default: 147 } 148 {{end -}} 149 {{if notEmptyStr .InName -}} 150 req := new({{.InName}}) 151 {{if .IsBindIn -}} 152 var bv _binding_ = req 153 if err := bv.Bind(c); err != nil { 154 {{- else -}} 155 if err := s.Bind(c, req); err != nil { 156 {{- end }} 157 s.Render(c, nil, err) 158 return 159 } 160 {{- end }} 161 {{if notEmptyStr .OutName -}} 162 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}}) 163 {{if .IsRenderOut -}} 164 if err != nil { 165 s.Render(c, nil, err) 166 return 167 } 168 var rv _render_ = resp 169 rv.Render(c) 170 {{- else -}} 171 s.Render(c, resp, err) 172 {{- end }} 173 {{- else -}} 174 s.Render(c, nil, s.{{.MethodName}}({{if .IsUseContext }}c{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 175 {{- end }} 176 }{{end}}{{if .IsFieldChain }}){{end}} 177 {{range .AnyHttpMethods}} router.Handle("{{.}}", "{{$field.Path}}", h{{if $field.IsFieldChain }}...{{end}}) 178 {{end}} } 179 {{end}} 180 {{- end -}} 181 } 182 183 {{ $unimplementedServant := print "Unimplemented" .TypeName "Servant" }} 184 // {{$unimplementedServant}} can be embedded to have forward compatible implementations. 185 type {{$unimplementedServant}} struct {} 186 187 {{if notEmptyStr .Chain }} 188 func ({{$unimplementedServant}}){{.Chain}}() gin.HandlersChain { 189 return nil 190 } 191 192 {{end}} 193 {{range .Fields}} 194 func ({{$unimplementedServant}}){{if .JustUseContext}}{{ .MethodName}}(c *gin.Context){{else}}{{.MethodName}}({{if .IsUseContext }}c *gin.Context{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName }}req *{{ .InName }}{{end}}) {{if notEmptyStr .OutName }}(*{{ .OutName}}, mir.Error){{else}}mir.Error{{end}}{{end}} { 195 {{if .JustUseContext -}} 196 c.String(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) 197 {{else -}} 198 return {{if notEmptyStr .OutName }}nil, {{end}}mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) 199 {{end -}} 200 } 201 202 {{end}} 203 func ({{$unimplementedServant}})mustEmbedUnimplemented{{.TypeName}}Servant() {} 204 {{ if .IsUseFieldChain }} 205 {{ $unimplementedChain := print "Unimplemented" .TypeName "Chain" }} 206 // {{$unimplementedChain}} can be embedded to have forward compatible implementations. 207 type {{$unimplementedChain}} struct {} 208 209 {{range .Fields}}{{if .IsFieldChain }}func (b *{{$unimplementedChain}}) Chain{{.MethodName}}() gin.HandlersChain { 210 return nil 211 } 212 {{end}} 213 {{end}} 214 func (b *{{$unimplementedChain}})mustEmbedUnimplemented{{.TypeName}}Chain() {} 215 {{ end }}