toValue<T> method

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

Implementation

@override
dynamic toValue<T>(T value) {
  if (value == null) return null;
  var element = _mapperFor(value)?.createElement(this);
  if (element != null) {
    try {
      try {
        Type type = T;
        String? typeId;
        if (value.runtimeType != type.nonNull &&
            value.runtimeType.base != UnresolvedType) {
          if (value is! Map && value is! Iterable) {
            if (element.mapper.implType == element.mapper.type ||
                value.runtimeType != element.mapper.implType) {
              typeId = value.runtimeType.id;
              type = value.runtimeType;
            }
          }
        }

        var typeArgs = type.args;

        var fallback = element.mapper.type.base.args;
        if (typeArgs.length != fallback.length) {
          typeArgs = fallback;
        }

        var result = element.encoder
            .callWith(parameters: [value], typeArguments: typeArgs);

        if (result is Map<String, dynamic> && typeId != null) {
          result['__type'] = typeId;
        }

        return result;
      } on ArgumentError catch (e, stacktrace) {
        Error.throwWithStackTrace(
          ArgumentError('Failed to call [encoder] function '
              'of ${element.runtimeType}: ${e.message}'),
          stacktrace,
        );
      }
    } catch (e, stacktrace) {
      Error.throwWithStackTrace(
        MapperException.chain(
            MapperMethod.encode, '(${value.runtimeType})', e),
        stacktrace,
      );
    }
  } else {
    throw MapperException.chain(
      MapperMethod.encode,
      '[$value]',
      MapperException.unknownType(value.runtimeType),
    );
  }
}