methodInvocationFromMap method
MethodInvocation<O>
methodInvocationFromMap(
- Map<
String, dynamic> map, { - FieldValueResolver? reviver,
- FieldNameResolver? nameResolver,
- bool jsonName = false,
Creates a MethodInvocation using map
entries as parameters.
Implementation
MethodInvocation<O> methodInvocationFromMap(Map<String, dynamic> map,
{FieldValueResolver? reviver,
FieldNameResolver? nameResolver,
bool jsonName = false}) {
// Resolve the valie, reviving it if needed:
Object? resolveValue(
ParameterReflection p, String pName, Object? val, bool contains) {
if (reviver != null) {
var type = p.type;
var valRevived = reviver(pName, val, type);
if (valRevived != null) {
if (valRevived is List &&
type.isListEntity &&
valRevived.any((e) => e == null)) {
var valRevivedUnresolved =
valRevived.map((e) => e ?? unresolvedParameterValue).toList();
return valRevivedUnresolved;
}
return valRevived;
}
if (contains) {
return val == null ? null : unresolvedParameterValue;
} else {
return absentParameterValue;
}
} else {
if (val != null) return val;
return contains ? null : absentParameterValue;
}
}
if (jsonName) {
var fieldsAliases = classReflection.fieldsJsonNameAliases;
var fieldsAliasesReverse =
fieldsAliases.map((key, value) => MapEntry(value, key));
return methodInvocation((p, i) {
var pJsonName = p.jsonName;
var pName = p.name;
var fAlias1 = fieldsAliases[pName];
var fAlias2 = fieldsAliasesReverse[pName];
if (nameResolver != null) {
pJsonName = nameResolver(pJsonName, map) ?? pJsonName;
pName = nameResolver(pName, map) ?? pName;
}
var contains = false;
Object? val;
if (map.containsKey(pJsonName)) {
val = map[pJsonName];
contains = true;
} else if (map.containsKey(pName)) {
val = map[pName];
contains = true;
} else if (fAlias1 != null && map.containsKey(fAlias1)) {
val = map[fAlias1];
contains = true;
} else if (fAlias2 != null && map.containsKey(fAlias2)) {
val = map[fAlias2];
contains = true;
}
return resolveValue(p, pName, val, contains);
});
} else {
return methodInvocation((p, i) {
var pName = p.name;
if (nameResolver != null) {
pName = nameResolver(pName, map) ?? pName;
}
var contains = false;
Object? val;
if (map.containsKey(pName)) {
val = map[pName];
contains = true;
}
return resolveValue(p, pName, val, contains);
});
}
}