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