addConverter<S, T> method

  1. @override
void addConverter<S, T>(
  1. Converter<S, T> converter, {
  2. Class<S>? sourceType,
  3. Class<T>? targetType,
})
override

Registers a simple Converter from one specific source type to one target type.


🔧 Example

registry.addConverter(StringToIntConverter());

registry.addConverter(StringToIntConverter(), sourceType: Class<String>(), targetType: Class<int>());

Implementation

@override
void addConverter<S, T>(Converter<S, T> converter, {Class<S>? sourceType, Class<T>? targetType}) {
  if(sourceType != null && targetType != null) {
    addPairedConverter(_PairedConverterAdapter(converter, sourceType, targetType, _pd, _convertNullableSource));
  } else if(sourceType == null && targetType == null) {
    final clazz = converter.getClass(null, converter.getPackageName());

    // We'll try to access the [Converter] class as an interface first
    List<Class> types = clazz.getDeclaredInterface<Converter>()?.getTypeParameters() ?? [];

    // If it fails, we'll try to access it as a superclass
    if(types.isEmpty) {
      types = clazz.getDeclaredSuperClass()?.getTypeParameters() ?? [];
    }

    if (types.isEmpty || types.length.isLessThan(2)) {
      throw ConversionException(
        'Unable to determine source type and target type for your '
        'Converter [${converter.runtimeType}]; does the class parameterize those types? If '
        'you are using a generic converter, make sure to explicitly specify the source '
        'and target types.'
      );
    }
    addPairedConverter(_PairedConverterAdapter(converter, types.getFirst(), types.getLast(), _pd, _convertNullableSource));
  }
}