methodInvocationFromMap method

MethodInvocation<O> methodInvocationFromMap(
  1. Map<String, dynamic> map, {
  2. FieldValueResolver? reviver,
  3. FieldNameResolver? nameResolver,
  4. 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);
    });
  }
}