code: func parseMessage(ctx *context, msgNode *jsongo.JSONNode) (*Message, error) {
  	if msgNode.Len() == 0 || msgNode.At(0).GetType() != jsongo.TypeValue {
  		return nil, errors.New("invalid JSON for message specified")
  	}
  
  	msgName, ok := msgNode.At(0).Get().(string)
  	if !ok {
  		return nil, fmt.Errorf("message name is %T, not a string", msgNode.At(0).Get())
  	}
  	msgCRC, ok := msgNode.At(msgNode.Len() - 1).At(crcField).Get().(string)
  	if !ok {
  
  		return nil, fmt.Errorf("message crc invalid or missing")
  	}
  
  	msg := Message{
  		Name: msgName,
  		CRC:  msgCRC,
  	}
  
  	// loop through message fields, skip first (name) and last (crc)
  	for j := 1; j < msgNode.Len()-1; j++ {
  		if msgNode.At(j).GetType() == jsongo.TypeArray {
  			fieldNode := msgNode.At(j)
  
  			field, err := parseField(ctx, fieldNode)
  			if err != nil {
  				return nil, err
  			}
  
  			msg.Fields = append(msg.Fields, *field)
  		}
  	}
  
  	return &msg, nil
  }
docs: // parseMessage parses VPP binary API message object from JSON node