Files
mautrix-telegram/pkg/gotd/gen/_template/server.tmpl
T
2025-06-27 20:03:37 -07:00

102 lines
3.1 KiB
Cheetah

{{ define "server" }}
{{ $pkg := $.Package }}
{{ template "header" $ }}
type ServerDispatcher struct{
fallback func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error)
handlers map[uint32]func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error)
}
func NewServerDispatcher(fallback func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error)) *ServerDispatcher {
return &ServerDispatcher{
fallback: fallback,
handlers: map[uint32]func(context.Context, *bin.Buffer) (bin.Encoder, error){},
}
}
func (s *ServerDispatcher) Handle(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
id, err := b.PeekID()
if err != nil{
return nil, err
}
f, ok := s.handlers[id]
if !ok {
return s.fallback(ctx, b)
}
return f(ctx, b)
}
{{ range $s:= $.Structs }}{{- if notEmpty $s.Method }}
{{- if $s.Result }}
{{- if $s.ResultSingular }}
func (s *ServerDispatcher) On{{ $s.Method }}(f func({{ template "request_params" $s }}) ({{ if not $s.ResultVector }}*{{ $s.Result }}{{ else }}{{ template "slice_result_name" $s }}{{ end }}, error)) {
handler := func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
var request {{ $s.Name }}
if err := request.Decode(b); err != nil{
return nil, err
}
response, err := f({{- template "unpack_request" $s }})
if err != nil{
return nil, err
}
{{- if $s.ResultVector }}
return &{{ $s.Result }}{Elems: response}, nil
{{- else }}
return response, nil
{{- end }}
}
s.handlers[{{ $s.Name }}TypeID] = handler
}
{{- else }}
func (s *ServerDispatcher) On{{ $s.Method }}(f func({{ template "request_params" $s }}) ({{if ne $s.Result "BoolClass"}}{{ $s.Result }}{{ else }}bool{{ end }}, error)) {
handler := func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
var request {{ $s.Name }}
if err := request.Decode(b); err != nil{
return nil, err
}
response, err := f({{- template "unpack_request" $s }})
if err != nil{
return nil, err
}
{{- if ne $s.Result "BoolClass" }}
return &{{ $s.ResultFunc }}Box{ {{ $s.ResultBaseName }}: response }, nil
{{- else }}
if response {
return &{{ $s.ResultFunc }}Box{ {{ $s.ResultBaseName }}: &BoolTrue{} }, nil
}
return &{{ $s.ResultFunc }}Box{ {{ $s.ResultBaseName }}: &BoolFalse{} }, nil
{{- end }}
}
s.handlers[{{ $s.Name }}TypeID] = handler
}
{{- end }}
{{- else }}
func (s *ServerDispatcher) On{{ $s.Method }}(f func({{ template "request_params" $s }}) error) {
handler := func(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
var request {{ $s.Name }}
if err := request.Decode(b); err != nil{
return nil, err
}
if err := f({{- template "unpack_request" $s }}); err != nil{
return nil, err
}
return &Ok{}, nil
}
s.handlers[{{ $s.Name }}TypeID] = handler
}
{{- end }}
{{ end }}
{{- end }}
{{- end }}