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}}