package com.lambdaworks.redis.protocol;
import com.lambdaworks.redis.RedisException;
import com.lambdaworks.redis.ScriptOutputType;
import com.lambdaworks.redis.codec.RedisCodec;
import com.lambdaworks.redis.output.*;
/**
* @author Mark Paluch
* @since 3.0
*/
public class BaseRedisCommandBuilder<K, V> {
protected RedisCodec<K, V> codec;
public BaseRedisCommandBuilder(RedisCodec<K, V> codec) {
this.codec = codec;
}
protected <T> Command<K, V, T> createCommand(CommandType type, CommandOutput<K, V, T> output) {
return createCommand(type, output, (CommandArgs<K, V>) null);
}
protected <T> Command<K, V, T> createCommand(CommandType type, CommandOutput<K, V, T> output, K key) {
CommandArgs<K, V> args = new CommandArgs<K, V>(codec).addKey(key);
return createCommand(type, output, args);
}
protected <T> Command<K, V, T> createCommand(CommandType type, CommandOutput<K, V, T> output, K key, V value) {
CommandArgs<K, V> args = new CommandArgs<K, V>(codec).addKey(key).addValue(value);
return createCommand(type, output, args);
}
protected <T> Command<K, V, T> createCommand(CommandType type, CommandOutput<K, V, T> output, K key, V[] values) {
CommandArgs<K, V> args = new CommandArgs<K, V>(codec).addKey(key).addValues(values);
return createCommand(type, output, args);
}
protected <T> Command<K, V, T> createCommand(CommandType type, CommandOutput<K, V, T> output, CommandArgs<K, V> args) {
return new Command<K, V, T>(type, output, args);
}
@SuppressWarnings("unchecked")
protected <T> CommandOutput<K, V, T> newScriptOutput(RedisCodec<K, V> codec, ScriptOutputType type) {
switch (type) {
case BOOLEAN:
return (CommandOutput<K, V, T>) new BooleanOutput<K, V>(codec);
case INTEGER:
return (CommandOutput<K, V, T>) new IntegerOutput<K, V>(codec);
case STATUS:
return (CommandOutput<K, V, T>) new StatusOutput<K, V>(codec);
case MULTI:
return (CommandOutput<K, V, T>) new NestedMultiOutput<K, V>(codec);
case VALUE:
return (CommandOutput<K, V, T>) new ValueOutput<K, V>(codec);
default:
throw new RedisException("Unsupported script output type");
}
}
}