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  }