fromValue<T> method

  1. @override
T fromValue<T>(
  1. dynamic value
)
override

Implementation

@override
T fromValue<T>(dynamic value) {
  if (value == null) {
    return value as T;
  }

  var type = T;
  if (value is Map<String, dynamic> && value['__type'] != null) {
    type = TypePlus.fromId(value['__type'] as String);
    if (type == UnresolvedType) {
      var e = MapperException.unresolvedType(value['__type'] as String);
      throw MapperException.chain(MapperMethod.decode, '($T)', e);
    }
  } else if (value is T) {
    return value;
  }

  var element = _mapperForType(type)?.createElement(this);
  if (element != null) {
    try {
      try {
        return element.decoder
            .callWith(parameters: [value], typeArguments: type.args) as T;
      } on ArgumentError catch (e, stacktrace) {
        Error.throwWithStackTrace(
          ArgumentError(
              'Failed to call [decoder] function of ${element.runtimeType}: ${e.message}'),
          stacktrace,
        );
      }
    } catch (e, stacktrace) {
      Error.throwWithStackTrace(
        MapperException.chain(MapperMethod.decode, '($type)', e),
        stacktrace,
      );
    }
  } else {
    throw MapperException.chain(
        MapperMethod.decode, '($type)', MapperException.unknownType(type));
  }
}