github.com/alimy/mir/v4@v4.1.0/internal/generator/templates/chi_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 }}chi "{{ .EngineInfo.PkgName }}{{else}}"github.com/go-chi/chi/v5{{end}}" 12 {{ declareImports .Imports }} 13 ) 14 {{- if .DeclareCoreInterface }} 15 type _binding_ interface { 16 Bind(*http.Request) mir.Error 17 } 18 19 type _render_ interface { 20 Render(http.ResponseWriter) 21 } 22 23 type _default_ interface { 24 Bind(*http.Request, any) mir.Error 25 Render(http.ResponseWriter, 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 middlewares for chi 36 {{.Chain}}() chi.Middlewares 37 {{end}} 38 {{range .Fields}} {{if .JustUseContext }}{{ .MethodName}}(http.ResponseWriter, *http.Request){{else}}{{.MethodName}}({{if .IsUseContext }}http.ResponseWriter, *http.Request{{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}}() chi.Middlewares 46 {{end}} 47 48 mustEmbedUnimplemented{{.TypeName}}Chain() 49 } 50 {{end}} 51 52 // Register{{.TypeName}}Servant register {{.TypeName}} servant to chi 53 func Register{{.TypeName}}Servant(e chi.Router, 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 := chi.NewRouter() 63 e.Mount("{{.Group}}", router){{else}} router := e{{end}} 64 {{if notEmptyStr .Chain }} 65 // use chain for router 66 middlewares := s.{{.Chain}}() 67 router.Use(middlewares...) 68 {{end}} 69 // register routes info to router 70 {{range .Fields}}{{if .NotHttpAny }} {{if .IsFieldChain }}router.With(cc.Chain{{.MethodName}}()...){{else}}router{{end}}.MethodFunc("{{.HttpMethod}}", "{{.Path}}", {{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(rw http.ResponseWriter, hr *http.Request) { 71 {{- if $.WatchCtxDone }} 72 select { 73 case <- hr.Context().Done(): 74 return 75 default: 76 } 77 {{end -}} 78 {{if notEmptyStr .InName -}} 79 req := new({{.InName}}) 80 {{if .IsBindIn -}} 81 var bv _binding_ = req 82 if err := bv.Bind(hr); err != nil { 83 {{- else -}} 84 if err := s.Bind(hr, req); err != nil { 85 {{- end }} 86 s.Render(rw, nil, err) 87 return 88 } 89 {{- end }} 90 {{if notEmptyStr .OutName -}} 91 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}}) 92 {{if .IsRenderOut -}} 93 if err != nil { 94 s.Render(rw, nil, err) 95 return 96 } 97 var rv _render_ = resp 98 rv.Render(rw) 99 {{- else -}} 100 s.Render(rw, resp, err) 101 {{- end }} 102 {{- else -}} 103 s.Render(rw, nil, s.{{.MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 104 {{- end }} 105 }{{end}}) 106 {{else if .JustHttpAny}} {{if .IsFieldChain }}router.With(cc.Chain{{.MethodName}}()...){{else}}router{{end}}.HandleFunc("{{.Path}}", {{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(rw http.ResponseWriter, hr *http.Request) { 107 {{- if $.WatchCtxDone }} 108 select { 109 case <- hr.Context().Done(): 110 return 111 default: 112 } 113 {{end -}} 114 {{if notEmptyStr .InName -}} 115 req := new({{.InName}}) 116 {{if .IsBindIn -}} 117 var bv _binding_ = req 118 if err := bv.Bind(hr); err != nil { 119 {{- else -}} 120 if err := s.Bind(hr, req); err != nil { 121 {{- end }} 122 s.Render(rw, nil, err) 123 return 124 } 125 {{- end }} 126 {{if notEmptyStr .OutName -}} 127 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}}) 128 {{if .IsRenderOut -}} 129 if err != nil { 130 s.Render(rw, nil, err) 131 return 132 } 133 var rv _render_ = resp 134 rv.Render(rw) 135 {{- else -}} 136 s.Render(rw, resp, err) 137 {{- end }} 138 {{- else -}} 139 s.Render(rw, nil, s.{{.MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 140 {{- end }} 141 }{{end}}) 142 {{else}}{{$field := .}} { 143 h := {{if .JustUseContext}}s.{{ .MethodName}}{{else}}func(rw http.ResponseWriter, hr *http.Request) { 144 {{- if $.WatchCtxDone }} 145 select { 146 case <- hr.Context().Done(): 147 return 148 default: 149 } 150 {{end -}} 151 {{if notEmptyStr .InName -}} 152 req := new({{.InName}}) 153 {{if .IsBindIn -}} 154 var bv _binding_ = req 155 if err := bv.Bind(hr); err != nil { 156 {{- else -}} 157 if err := s.Bind(hr, req); err != nil { 158 {{- end }} 159 s.Render(rw, nil, err) 160 return 161 } 162 {{- end }} 163 {{if notEmptyStr .OutName -}} 164 resp, err := s.{{ .MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}}) 165 {{if .IsRenderOut -}} 166 if err != nil { 167 s.Render(rw, nil, err) 168 return 169 } 170 var rv _render_ = resp 171 rv.Render(rw) 172 {{- else -}} 173 s.Render(rw, resp, err) 174 {{- end }} 175 {{- else -}} 176 s.Render(rw, nil, s.{{.MethodName}}({{if .IsUseContext }}rw, hr{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName}}req{{end}})) 177 {{- end }} 178 }{{end}} 179 {{if .IsFieldChain }} router := router.With(cc.Chain{{.MethodName}}()...){{end}} 180 {{range .AnyHttpMethods}} router.MethodFunc("{{.}}", "{{$field.Path}}", h) 181 {{end}} } 182 {{end}} 183 {{- end -}} 184 } 185 186 {{ $unimplementedServant := print "Unimplemented" .TypeName "Servant" }} 187 // {{$unimplementedServant}} can be embedded to have forward compatible implementations. 188 type {{$unimplementedServant}} struct {} 189 190 {{if notEmptyStr .Chain }} 191 func ({{$unimplementedServant}}){{.Chain}}() chi.Middlewares { 192 return nil 193 } 194 195 {{end}} 196 {{range .Fields}} 197 func ({{$unimplementedServant}}){{if .JustUseContext }}{{ .MethodName}}(rw http.ResponseWriter, hr *http.Request){{else}}{{.MethodName}}({{if .IsUseContext }}rw http.ResponseWriter, hr *http.Request{{if notEmptyStr .InName }}, {{end}}{{end}}{{if notEmptyStr .InName }}req *{{ .InName }}{{end}}) {{if notEmptyStr .OutName }}(*{{ .OutName}}, mir.Error){{else}}mir.Error{{end}}{{end}} { 198 {{if .JustUseContext -}} 199 rw.WriteHeader(http.StatusNotImplemented) 200 rw.Write([]byte("method not implemented")) 201 {{else -}} 202 return {{if notEmptyStr .OutName }}nil, {{end}}mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) 203 {{end -}} 204 } 205 206 {{end}} 207 func ({{$unimplementedServant}})mustEmbedUnimplemented{{.TypeName}}Servant() {} 208 {{if .IsUseFieldChain }} 209 {{ $unimplementedChain := print "Unimplemented" .TypeName "Chain" }} 210 // {{$unimplementedChain}} can be embedded to have forward compatible implementations. 211 type {{$unimplementedChain}} struct {} 212 213 {{range .Fields}}{{if .IsFieldChain }}func (b *{{$unimplementedChain}}) Chain{{.MethodName}}() chi.Middlewares { 214 return nil 215 } 216 {{end}} 217 {{end}} 218 func (b *{{$unimplementedChain}})mustEmbedUnimplemented{{.TypeName}}Chain() {} 219 {{end}}