gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/server/grpc/handler.go (about) 1 package grpc 2 3 import ( 4 "reflect" 5 6 "gitee.com/liuxuezhan/go-micro-v1.18.0/registry" 7 "gitee.com/liuxuezhan/go-micro-v1.18.0/server" 8 ) 9 10 type rpcHandler struct { 11 name string 12 handler interface{} 13 endpoints []*registry.Endpoint 14 opts server.HandlerOptions 15 } 16 17 func newRpcHandler(handler interface{}, opts ...server.HandlerOption) server.Handler { 18 options := server.HandlerOptions{ 19 Metadata: make(map[string]map[string]string), 20 } 21 22 for _, o := range opts { 23 o(&options) 24 } 25 26 typ := reflect.TypeOf(handler) 27 hdlr := reflect.ValueOf(handler) 28 name := reflect.Indirect(hdlr).Type().Name() 29 30 var endpoints []*registry.Endpoint 31 32 for m := 0; m < typ.NumMethod(); m++ { 33 if e := extractEndpoint(typ.Method(m)); e != nil { 34 e.Name = name + "." + e.Name 35 36 for k, v := range options.Metadata[e.Name] { 37 e.Metadata[k] = v 38 } 39 40 endpoints = append(endpoints, e) 41 } 42 } 43 44 return &rpcHandler{ 45 name: name, 46 handler: handler, 47 endpoints: endpoints, 48 opts: options, 49 } 50 } 51 52 func (r *rpcHandler) Name() string { 53 return r.name 54 } 55 56 func (r *rpcHandler) Handler() interface{} { 57 return r.handler 58 } 59 60 func (r *rpcHandler) Endpoints() []*registry.Endpoint { 61 return r.endpoints 62 } 63 64 func (r *rpcHandler) Options() server.HandlerOptions { 65 return r.opts 66 }