deserializeValue<T> function

T deserializeValue<T>(
  1. dynamic value
)

Basic deserialization function. Handles:

Implementation

T deserializeValue<T>(dynamic value) {
  if (!(kSupportedPrimitiveTypes.contains(value.runtimeType) || //
          (value is List || value is Map || value is Set) //
      )) {
    throw ArgumentError.value(
      value.runtimeType,
      'type',
      'Unsupported input type for deserialization: ${value.runtimeType}',
    );
  }

  if (value is T) {
    return value;
  }

  if (T == Null || value == null) {
    return null as T;
  } else {
    // deserialize nullables
    if (isNullable<T>()) {
      if (isNullableSelf<int, T>()) {
        return int.tryParse(value) as T;
      } else if (isNullableSelf<double, T>()) {
        return double.tryParse(value) as T;
      } else if (isNullableSelf<String, T>()) {
        return value.toString() as T;
      } else if (isNullableSelf<bool, T>()) {
        return bool.tryParse(value) as T;
      }
    }
    // deserialize non-nullables
    else {
      if (T == int) {
        return int.parse(value) as T;
      } else if (T == double) {
        return double.parse(value) as T;
      } else if (T == String) {
        return value.toString() as T;
      } else if (T == bool) {
        return bool.parse(value) as T;
      } else if (T == List) {
        return (value as List).map(_fallbackDeserializeValue).toList() as T;
      } else if (T == Map) {
        return (value as Map).map((k, v) => MapEntry(_fallbackDeserializeValue(k)!, _fallbackDeserializeValue(v))) as T;
      }
    }
  }

  throw ArgumentError.value(
    value,
    'value',
    'Cannot deserialize value of type ${value.runtimeType} to type $T',
  );
}