package io.shockah.skylark.commands; import io.shockah.skylark.event.GenericUserMessageEvent; public class ChainCommand<T, R> extends Command<T, R> { private final Command<?, ?>[] commands; public ChainCommand(Command<?, ?>[] commands) { this.commands = commands; } @SuppressWarnings("unchecked") @Override public T prepareChainedCallInput(GenericUserMessageEvent e, CommandResult<T> previousResult) { Command<Object, Object> objectCommand = (Command<Object, Object>)commands[0]; return (T)objectCommand.prepareChainedCallInput(e, (CommandResult<Object>)previousResult); } @SuppressWarnings("unchecked") @Override public T convertToInput(GenericUserMessageEvent e, Object input) throws CommandParseException { return (T)input; } @SuppressWarnings("unchecked") @Override public T parseInput(GenericUserMessageEvent e, String input) throws CommandParseException { return (T)commands[0].parseInput(e, input); } @SuppressWarnings("unchecked") @Override public CommandResult<R> call(CommandCall call, T input) { Object value = input; CommandResult<?> previousResult = null; for (Command<?, ?> genericCommand : commands) { Command<Object, Object> objectCommand = (Command<Object, Object>)genericCommand; Object inputToCall = value; if (previousResult != null) inputToCall = objectCommand.prepareChainedCallInput(call.event, (CommandResult<Object>)previousResult); try { inputToCall = objectCommand.convertToInput(call.event, inputToCall); } catch (Exception e) { return CommandResult.error(e.getMessage()); } previousResult = objectCommand.call(call, inputToCall); if (previousResult.error != null) return CommandResult.error(previousResult.error); value = previousResult.value; } return CommandResult.of((R)value); } }