/*
* Copyright 2011-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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<>(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<>(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<>(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<>(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<>(codec);
case INTEGER:
return (CommandOutput<K, V, T>) new IntegerOutput<>(codec);
case STATUS:
return (CommandOutput<K, V, T>) new StatusOutput<>(codec);
case MULTI:
return (CommandOutput<K, V, T>) new NestedMultiOutput<>(codec);
case VALUE:
return (CommandOutput<K, V, T>) new ValueOutput<>(codec);
default:
throw new RedisException("Unsupported script output type");
}
}
}