genericCall function
dynamic
genericCall(
- TypeInfo info,
- Function fn,
- dynamic value
)
Implementation
dynamic genericCall(TypeInfo info, Function fn, dynamic value) {
var params = [...info.params];
dynamic call(dynamic Function<T>() next) {
var t = params.removeAt(0);
if (_mappers[t.type] != null) {
return genericCall(t, _mappers[t.type]!.typeFactory ?? (f) => f(), next);
} else {
throw MapperException('Cannot find generic wrapper for type $t.');
}
}
if (params.isEmpty) {
return fn(value);
} else if (params.length == 1) {
return call(<A>() => fn<A>(value));
} else if (params.length == 2) {
return call(<A>() => call(<B>() => fn<A, B>(value)));
} else if (params.length == 3) {
return call(<A>() => call(<B>() => call(<C>() => fn<A, B, C>(value))));
} else {
throw MapperException('Cannot construct generic wrapper for type $info. Mapper only supports generic classes with up to 3 type arguments.');
}
}