Use type uint8 to replace boolean fields in response

This commit is contained in:
Elara 2022-05-07 14:01:10 -07:00
parent b1e7ded874
commit ff5f211a83
3 changed files with 19 additions and 13 deletions

View File

@ -105,7 +105,7 @@ func (c *Client) Call(ctx context.Context, rcvr, method string, arg interface{},
c.chMtx.Unlock()
// If response is an error, return error
if resp.IsError {
if resp.Type == types.ResponseTypeError {
return errors.New(resp.Error)
}
@ -118,7 +118,7 @@ func (c *Client) Call(ctx context.Context, rcvr, method string, arg interface{},
retVal := reflect.ValueOf(ret)
// If response is a channel
if resp.IsChannel {
if resp.Type == types.ResponseTypeChannel {
// If return value is not a channel, return error
if retVal.Kind() != reflect.Chan {
return ErrReturnNotChannel
@ -137,7 +137,7 @@ func (c *Client) Call(ctx context.Context, rcvr, method string, arg interface{},
// For every value received from channel
for val := range c.chs[chID] {
//s := time.Now()
if val.ChannelDone {
if val.Type == types.ResponseTypeChannelDone {
// Close and delete channel
c.chMtx.Lock()
close(c.chs[chID])

View File

@ -26,12 +26,18 @@ type Request struct {
Arg any
}
type ResponseType uint8
const (
ResponseTypeError ResponseType = iota
ResponseTypeChannel
ResponseTypeChannelDone
)
// Response represents a response returned by the server
type Response struct {
Type ResponseType
ID string
ChannelDone bool
IsChannel bool
IsError bool
Error string
Return any
}

View File

@ -312,7 +312,7 @@ func (s *Server) handleConn(c codec.Codec) {
// If function has created a channel
if ctx.isChannel {
// Set IsChannel to true
res.IsChannel = true
res.Type = types.ResponseTypeChannel
// Overwrite return value with channel ID
res.Return = ctx.channelID
@ -342,8 +342,8 @@ func (s *Server) handleConn(c codec.Codec) {
codecMtx.Lock()
c.Encode(types.Response{
ID: ctx.channelID,
ChannelDone: true,
Type: types.ResponseTypeChannelDone,
ID: ctx.channelID,
})
codecMtx.Unlock()
}()
@ -361,10 +361,10 @@ func (s *Server) handleConn(c codec.Codec) {
func (s *Server) sendErr(c codec.Codec, req types.Request, val any, err error) {
// Encode error response using codec
c.Encode(types.Response{
ID: req.ID,
IsError: true,
Error: err.Error(),
Return: val,
Type: types.ResponseTypeError,
ID: req.ID,
Error: err.Error(),
Return: val,
})
}