This commit is contained in:
withchao
2023-02-24 19:16:26 +08:00
parent d7640ca864
commit c019dd5f1e
12 changed files with 239 additions and 211 deletions
+28 -11
View File
@@ -3,18 +3,26 @@ package api2rpc
import (
"context"
"google.golang.org/grpc"
"reflect"
)
var nameMap = map[string]string{}
func getName[T any]() string {
var t T
return reflect.TypeOf(&t).Elem().Name()
}
// NewRpc A: apiReq B: apiResp C: rpcReq D: rpcResp Z: rpcClient (group.GroupClient)
func NewRpc[A, B any, C, D any, Z any](bind ApiBind[A, B], client func(conn *grpc.ClientConn) Z, rpc func(client Z, ctx context.Context, req *C, options ...grpc.CallOption) (*D, error)) *Rpc[A, B, C, D, Z] {
return &Rpc[A, B, C, D, Z]{
func NewRpc[A, B any, C, D any, Z any](bind ApiBind[A, B], client func(conn *grpc.ClientConn) Z, rpc func(client Z, ctx context.Context, req *C, options ...grpc.CallOption) (*D, error)) *RpcXXXX[A, B, C, D, Z] {
return &RpcXXXX[A, B, C, D, Z]{
bind: bind,
client: client,
rpc: rpc,
}
}
type Rpc[A, B any, C, D any, Z any] struct {
type RpcXXXX[A, B any, C, D any, Z any] struct {
bind ApiBind[A, B]
name string
client func(conn *grpc.ClientConn) Z
@@ -23,36 +31,45 @@ type Rpc[A, B any, C, D any, Z any] struct {
after func(rpcResp *D, apiResp *B, bind func() error) error
}
func (a *Rpc[A, B, C, D, Z]) Name(name string) *Rpc[A, B, C, D, Z] {
func (a *RpcXXXX[A, B, C, D, Z]) Name(name string) *RpcXXXX[A, B, C, D, Z] {
a.name = name
return a
}
func (a *Rpc[A, B, C, D, Z]) Before(fn func(apiReq *A, rpcReq *C, bind func() error) error) *Rpc[A, B, C, D, Z] {
func (a *RpcXXXX[A, B, C, D, Z]) Before(fn func(apiReq *A, rpcReq *C, bind func() error) error) *RpcXXXX[A, B, C, D, Z] {
a.before = fn
return a
}
func (a *Rpc[A, B, C, D, Z]) After(fn func(rpcResp *D, apiResp *B, bind func() error) error) *Rpc[A, B, C, D, Z] {
func (a *RpcXXXX[A, B, C, D, Z]) After(fn func(rpcResp *D, apiResp *B, bind func() error) error) *RpcXXXX[A, B, C, D, Z] {
a.after = fn
return a
}
func (a *Rpc[A, B, C, D, Z]) defaultCopyReq(apiReq *A, rpcReq *C) error {
func (a *RpcXXXX[A, B, C, D, Z]) defaultCopyReq(apiReq *A, rpcReq *C) error {
CopyAny(apiReq, rpcReq)
return nil
}
func (a *Rpc[A, B, C, D, Z]) defaultCopyResp(rpcResp *D, apiResp *B) error {
func (a *RpcXXXX[A, B, C, D, Z]) defaultCopyResp(rpcResp *D, apiResp *B) error {
CopyAny(rpcResp, apiResp)
return nil
}
func (a *Rpc[A, B, C, D, Z]) GetGrpcConn() (*grpc.ClientConn, error) {
func (a *RpcXXXX[A, B, C, D, Z]) getZtype() string {
return ""
}
func (a *RpcXXXX[A, B, C, D, Z]) GetGrpcConn() (*grpc.ClientConn, error) {
if a.name == "" {
a.name = nameMap[getName[Z]()]
}
// todo 获取连接
return nil, nil // todo
}
func (a *Rpc[A, B, C, D, Z]) execute() (*B, error) {
func (a *RpcXXXX[A, B, C, D, Z]) execute() (*B, error) {
var apiReq A
if err := a.bind.Bind(&apiReq); err != nil {
return nil, err
@@ -92,6 +109,6 @@ func (a *Rpc[A, B, C, D, Z]) execute() (*B, error) {
return &apiResp, nil
}
func (a *Rpc[A, B, C, D, Z]) Call() {
func (a *RpcXXXX[A, B, C, D, Z]) Call() {
a.bind.Resp(a.execute())
}