|
|
@@ -22,8 +22,14 @@ public class DynamicInvoker {
|
|
|
|
|
|
private final List<RFunction> list;
|
|
|
|
|
|
+ private final boolean passNull;
|
|
|
+
|
|
|
+ private final boolean passIdent;
|
|
|
+
|
|
|
private DynamicInvoker(Builder src) {
|
|
|
this.list = src.list;
|
|
|
+ this.passNull = src.passNull;
|
|
|
+ this.passIdent = src.passIdent;
|
|
|
}
|
|
|
|
|
|
public static Builder builder() {
|
|
|
@@ -32,12 +38,15 @@ public class DynamicInvoker {
|
|
|
|
|
|
public Object call(Object value) {
|
|
|
Function<Object, Object> func = match(value)
|
|
|
- .orElseThrow(() -> new IllegalArgumentException("No method found for: " + value.getClass()));
|
|
|
+ .orElseThrow(() -> new IllegalArgumentException("No method found for: " + IClass.typefor(value)));
|
|
|
return func.apply(value);
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public Optional<Function<Object, Object>> match(Object value) {
|
|
|
+ if(value == null && passNull) {
|
|
|
+ return Optional.of(v -> v);
|
|
|
+ }
|
|
|
for (RFunction r : list) {
|
|
|
if (r.arg.isInstance(value)) {
|
|
|
return Optional.of(r.func);
|
|
|
@@ -48,13 +57,13 @@ public class DynamicInvoker {
|
|
|
|
|
|
public <T,R> R call(Class<R> returns, T value) {
|
|
|
Function<T, R> func = match(returns, value)
|
|
|
- .orElseThrow(() -> new IllegalArgumentException("No method found for: " + value.getClass() + "=>" + ClassUtils.box(returns)));
|
|
|
+ .orElseThrow(() -> new IllegalArgumentException("No method found for: " + IClass.typefor(value) + " =>" + ClassUtils.box(returns)));
|
|
|
return func.apply(value);
|
|
|
}
|
|
|
|
|
|
public <T,R> R call(IClass<R> returns, T value) {
|
|
|
Function<T, R> func = match(returns, value)
|
|
|
- .orElseThrow(() -> new IllegalArgumentException("No method found for: " + value.getClass() + "=>" + ClassUtils.box(returns)));
|
|
|
+ .orElseThrow(() -> new IllegalArgumentException("No method found for: " + IClass.typefor(value) + " => " + ClassUtils.box(returns)));
|
|
|
return func.apply(value);
|
|
|
}
|
|
|
|
|
|
@@ -64,6 +73,12 @@ public class DynamicInvoker {
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public <T, R> Optional<Function<T,R>> match(IClass<R> returns, T value) {
|
|
|
+ if(value == null && passNull) {
|
|
|
+ return Optional.of(v -> null);
|
|
|
+ }
|
|
|
+ if(value!=null && returns.isInstance(value) && passIdent) {
|
|
|
+ return Optional.of(v -> returns.cast(v));
|
|
|
+ }
|
|
|
for (RFunction r : list) {
|
|
|
if (r.arg.isInstance(value)) {
|
|
|
if(returns.isSuper(r.ret)) {
|
|
|
@@ -72,6 +87,9 @@ public class DynamicInvoker {
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+ if(returns.raw().isInstance(value) && passIdent) {
|
|
|
+ return Optional.of(v -> returns.cast(v));
|
|
|
+ }
|
|
|
return Optional.empty();
|
|
|
}
|
|
|
|
|
|
@@ -81,6 +99,20 @@ public class DynamicInvoker {
|
|
|
|
|
|
private final List<RFunction> list = new ArrayList<>();
|
|
|
|
|
|
+ private boolean passNull = true;
|
|
|
+
|
|
|
+ private boolean passIdent = true;
|
|
|
+
|
|
|
+ public Builder passIdent(boolean passIdent) {
|
|
|
+ this.passIdent = passIdent;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Builder passNull(boolean passNull) {
|
|
|
+ this.passNull = passNull;
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
public <T,R> Builder append(Class<T> argument, Class<R> returns, Function<T, R> function) {
|
|
|
return append0(argument, IClass.typeinfo(returns), function);
|
|
|
}
|