github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/helper/codec/inmem.go (about)

     1  package codec
     2  
     3  import (
     4  	"errors"
     5  	"net/rpc"
     6  	"reflect"
     7  )
     8  
     9  // InmemCodec is used to do an RPC call without going over a network
    10  type InmemCodec struct {
    11  	Method string
    12  	Args   interface{}
    13  	Reply  interface{}
    14  	Err    error
    15  }
    16  
    17  func (i *InmemCodec) ReadRequestHeader(req *rpc.Request) error {
    18  	req.ServiceMethod = i.Method
    19  	return nil
    20  }
    21  
    22  func (i *InmemCodec) ReadRequestBody(args interface{}) error {
    23  	if args == nil {
    24  		return nil
    25  	}
    26  	sourceValue := reflect.Indirect(reflect.Indirect(reflect.ValueOf(i.Args)))
    27  	dst := reflect.Indirect(reflect.Indirect(reflect.ValueOf(args)))
    28  	dst.Set(sourceValue)
    29  	return nil
    30  }
    31  
    32  func (i *InmemCodec) WriteResponse(resp *rpc.Response, reply interface{}) error {
    33  	if resp.Error != "" {
    34  		i.Err = errors.New(resp.Error)
    35  		return nil
    36  	}
    37  	sourceValue := reflect.Indirect(reflect.Indirect(reflect.ValueOf(reply)))
    38  	dst := reflect.Indirect(reflect.Indirect(reflect.ValueOf(i.Reply)))
    39  	dst.Set(sourceValue)
    40  	return nil
    41  }
    42  
    43  func (i *InmemCodec) Close() error {
    44  	return nil
    45  }