package cuke4duke.internal.clj;
import clojure.lang.AFunction;
import cuke4duke.internal.Utils;
import cuke4duke.internal.language.AbstractStepDefinition;
import cuke4duke.internal.language.JdkPatternArgumentMatcher;
import cuke4duke.internal.language.StepArgument;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.regex.Pattern;
public class CljStepDefinition extends AbstractStepDefinition {
private final Pattern regexp;
private final AFunction closure;
public CljStepDefinition(CljLanguage cljLanguage, Pattern regexp, AFunction closure) throws Throwable {
super(cljLanguage);
this.regexp = regexp;
this.closure = closure;
register();
}
public String regexp_source() {
return regexp.pattern();
}
public String file_colon_line() {
return regexp_source();
}
@Override
public Object invokeWithArgs(Object[] javaArgs) throws Throwable {
Method functionInvoke = lookupInvokeMethod(javaArgs);
try {
return functionInvoke.invoke(closure, javaArgs);
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
public List<StepArgument> arguments_from(String stepName) throws UnsupportedEncodingException {
return JdkPatternArgumentMatcher.argumentsFrom(regexp, stepName);
}
// Clojure's AFunction.invokeWithArgs doesn't take varargs :-/
private Method lookupInvokeMethod(Object[] args) throws NoSuchMethodException {
return AFunction.class.getMethod("invoke", Utils.objectClassArray(args.length));
}
}