public OperandSelectorMessage Parse(OperandSelectorMessage unparsedMessage)
 {
     if (unparsedMessage.IsParsed)
     {
         throw new ArgumentException($"{nameof(OperandSelectorMessage)} has been already parsed");
     }
     string[] tokens = unparsedMessage.Content.Split(OperandSelectorMessage.CONTENT_DELIMITER);
     if (tokens.Length == 3 &&
         short.TryParse(tokens[0], out short senderId) &&
         tokens[1].Length == 1)
     {
         unparsedMessage.SenderId = senderId;
         unparsedMessage.Type     = (OperandSelectorMessageType)tokens[1][0];
         unparsedMessage.Operand  = tokens[2];
         unparsedMessage.Content  = string.Empty;
     }
     else
     {
         throw new ArgumentException($"{nameof(OperandSelectorMessage)} is in invalid format");
     }
     return(unparsedMessage);
 }
        public void ProcessParsedMessage(OperandSelectorMessage parsedMessage)
        {
            switch (parsedMessage.Type)
            {
            case OperandSelectorMessageType.NotParsed:
                throw new ArgumentException($"{nameof(OperandSelectorMessage)} must be parsed before being processed");

            case OperandSelectorMessageType.OperandAvailable:
                NetworkOperator.Registers.Get <OperandSelector>(parsedMessage.SenderId).RegisterOperand(parsedMessage.Operand);
                break;

            case OperandSelectorMessageType.OperandUnavailable:
                NetworkOperator.Registers.Get <OperandSelector>(parsedMessage.SenderId).UnregisterOperand(parsedMessage.Operand);
                break;

            case OperandSelectorMessageType.SetOperand:
                NetworkOperator.Registers.Get <OperandSelector>(parsedMessage.SenderId).SelectOperand(parsedMessage.Operand);
                break;

            default:
                break;
            }
        }
 public void ProcessUnparsedMessage(OperandSelectorMessage unparsedMessage)
 => ProcessParsedMessage(OperandSelectorMessageParser.Current.Parse(unparsedMessage));