From aba784d39b51322ea8b8c4833d7c0d34774cb658 Mon Sep 17 00:00:00 2001 From: Anton Sattarov <dirty.mew@gmail.com> Date: Tue, 3 Dec 2024 21:34:20 +0100 Subject: [PATCH] add client template and proto decoder interface --- assets/templates/transport/grpc_client.tmpl | 87 +++++++++++++++++++++ pkg/invitations/client.go | 82 +++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 assets/templates/transport/grpc_client.tmpl create mode 100644 pkg/invitations/client.go diff --git a/assets/templates/transport/grpc_client.tmpl b/assets/templates/transport/grpc_client.tmpl new file mode 100644 index 00000000..757071cf --- /dev/null +++ b/assets/templates/transport/grpc_client.tmpl @@ -0,0 +1,87 @@ +import ( + "context" + + "git.perx.ru/perxis/perxis-go/pkg/options" + pb "git.perx.ru/perxis/perxis-go/proto/{{lower .Interface.Name}}" + "google.golang.org/grpc" +) + + + +type Client struct { + client pb.{{.Interface.Name}}Client + decoder ProtoDecoder +} + +var _ {{.Interface.Name}} = &Client{} + +func NewClient(conn *grpc.ClientConn, decoder ProtoDecoder) *Client { + return &Client{ + client: pb.New{{.Interface.Name}}Client(conn), + decoder: decoder, + } +} + +type ProtoDecoder interface { +{{range $method := .Interface.Methods}} +{{- if $method.ReturnsError}} + {{ $resList := list }} + {{ $resListLen := add 0 }} + {{- range $param := $method.Results -}} + {{- if not ( and $method.ReturnsError (eq $param.Name "err")) -}} + {{- $resList = append $resList (printf "%s %s" $param.Name $param.Type) -}} + {{- $resListLen = add $resListLen 1 -}} + {{- end -}} + {{- end -}} + + {{- $paramList := list -}} + {{- range $param := $method.Params -}} + {{- if not ( and $method.AcceptsContext (eq $param.Name "ctx")) -}} + {{- $paramList = append $paramList (printf "%s %s" $param.Name $param.Type) + -}} + {{- end -}} + {{- end -}} + + {{ $method.Name }}Request({{ $paramList | join `, ` }}) *pb.{{ $method.Name }}Request + {{- if gt $resListLen 0 }} + {{ $method.Name }}Response(res *pb.{{ $method.Name }}Response) ({{ $resList | join `, ` }}) + {{- end }} +{{- end -}} +{{end}} +} + + +{{range $method := .Interface.Methods}} + {{- if $method.ReturnsError}} + {{ $resList := list }} + {{ $resListLen := add 0 }} + {{- range $param := $method.Results -}} + {{- if not ( and $method.ReturnsError (eq $param.Name "err")) -}} + {{- $resList = append $resList $param.Name -}} + {{- $resListLen = add $resListLen 1 -}} + {{- end -}} + {{- end -}} + + {{- $paramList := list -}} + {{- range $param := $method.Params -}} + {{- if not ( and $method.AcceptsContext (eq $param.Name "ctx")) -}} + {{- $paramList = append $paramList $param.Name -}} + {{- end -}} + {{- end -}} + + + // {{$method.Name}} implements {{$.Interface.Name}} + func (c *Client) {{$method.Declaration}} { + request := c.decoder.{{$method.Name}}Request({{ $paramList | join `, ` }}) + {{- if gt $resListLen 0 }} + res, err := c.client.{{ $method.Name }}(ctx, request) + {{- else }} + _, err = c.client.{{ $method.Name }}(ctx, request) + {{- end }} + {{- if gt $resListLen 0 }} + {{ $resList | join `,` }} = c.decoder.{{ $method.Name }}Response(res) + {{- end }} + return + } + {{ end }} +{{ end }} diff --git a/pkg/invitations/client.go b/pkg/invitations/client.go new file mode 100644 index 00000000..6566d65d --- /dev/null +++ b/pkg/invitations/client.go @@ -0,0 +1,82 @@ +// Code generated by gowrap. DO NOT EDIT. +// template: ../../assets/templates/transport/grpc_client.tmpl +// gowrap: http://github.com/hexdigest/gowrap + +package invitations + +//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/invitations -i Invitations -t ../../assets/templates/transport/grpc_client.tmpl -o client.go -l "" + +import ( + "context" + + "git.perx.ru/perxis/perxis-go/pkg/options" + pb "git.perx.ru/perxis/perxis-go/proto/invitations" + "google.golang.org/grpc" +) + +type Client struct { + client pb.InvitationsClient + decoder ProtoDecoder +} + +var _ Invitations = &Client{} + +func NewClient(conn *grpc.ClientConn, decoder ProtoDecoder) *Client { + return &Client{ + client: pb.NewInvitationsClient(conn), + decoder: decoder, + } +} + +type ProtoDecoder interface { + AcceptRequest(invitationId string, userId string) *pb.AcceptRequest + + CreateRequest(invitation *Invitation) *pb.CreateRequest + CreateResponse(res *pb.CreateResponse) (created *Invitation) + + DeleteRequest(invitationId string) *pb.DeleteRequest + + FindRequest(filter *Filter, opts *options.FindOptions) *pb.FindRequest + FindResponse(res *pb.FindResponse) (invitations []*Invitation, total int) + + GetRequest(invitationId string) *pb.GetRequest + GetResponse(res *pb.GetResponse) (invitation *Invitation) +} + +// Accept implements Invitations +func (c *Client) Accept(ctx context.Context, invitationId string, userId string) (err error) { + request := c.decoder.AcceptRequest(invitationId, userId) + _, err = c.client.Accept(ctx, request) + return +} + +// Create implements Invitations +func (c *Client) Create(ctx context.Context, invitation *Invitation) (created *Invitation, err error) { + request := c.decoder.CreateRequest(invitation) + res, err := c.client.Create(ctx, request) + created = c.decoder.CreateResponse(res) + return +} + +// Delete implements Invitations +func (c *Client) Delete(ctx context.Context, invitationId string) (err error) { + request := c.decoder.DeleteRequest(invitationId) + _, err = c.client.Delete(ctx, request) + return +} + +// Find implements Invitations +func (c *Client) Find(ctx context.Context, filter *Filter, opts *options.FindOptions) (invitations []*Invitation, total int, err error) { + request := c.decoder.FindRequest(filter, opts) + res, err := c.client.Find(ctx, request) + invitations, total = c.decoder.FindResponse(res) + return +} + +// Get implements Invitations +func (c *Client) Get(ctx context.Context, invitationId string) (invitation *Invitation, err error) { + request := c.decoder.GetRequest(invitationId) + res, err := c.client.Get(ctx, request) + invitation = c.decoder.GetResponse(res) + return +} -- GitLab