public RespValue Execute(IExecutionContext context, RespValue request) { try { EnsureArray(request); var requestParts = request.GetItems(); EnsureNonEmptyArray(requestParts); var commandPart = requestParts.First(); var argumentsPart = requestParts.Skip(1).ToArray(); var commandName = commandPart.GetString().ToUpperInvariant(); ICommand command; if (!commandsMap.TryGetValue(commandName, out command)) { return RespValue.Error(string.Format("ERR Unknown command '{0}'", commandName)); } return command.Execute(context, argumentsPart); } catch (Exception) { return SharedContrants.UnknownError; } }
private static void WriteRespValue(Stream stream, RespValue respValue) { switch (respValue.Type) { case RespValueType.SimpleString: WriteSimpleString(stream, respValue); break; case RespValueType.Error: WriteErrorString(stream, respValue); break; case RespValueType.BulkString: WriteBulkString(stream, respValue); break; case RespValueType.Array: { if (respValue.IsNull()) { WriteNullable(stream, '*'); } else { var respValues = respValue.GetItems(); WriteHeader(stream, '*'); WriteInt(stream, respValues.Length); WriteCrLf(stream); foreach (var item in respValues) WriteRespValue(stream, item); } break; } case RespValueType.Integer: { WriteInteger(stream, respValue); break; } default: throw new ArgumentOutOfRangeException("respValue", respValue.Type.ToString()); } }