matchTypeByName static method

bool matchTypeByName(
  1. String? expectedType,
  2. TypeCode actualType, [
  3. dynamic actualValue
])

Matches expected type to an actual type.

  • expectedType an expected type name to match.
  • actualType an actual type to match defined by type code.
  • actualValue an optional value to match its type to the expected one. Returns true if types are matching and false if they don't.

Implementation

static bool matchTypeByName(String? expectedType, TypeCode actualType,
    [actualValue]) {
  if (expectedType == null) return true;
  // if (actualType == null) throw Exception('Actual type cannot be null');

  expectedType = expectedType.toLowerCase();

  if (expectedType == 'object') {
    return true;
  } else if (expectedType == 'int' || expectedType == 'integer') {
    return actualType == TypeCode.Integer
        // Special provisions for dynamic data
        ||
        actualType == TypeCode.Long;
  } else if (expectedType == 'long') {
    return actualType == TypeCode.Long
        // Special provisions for dynamic data
        ||
        actualType == TypeCode.Integer;
  } else if (expectedType == 'float') {
    return actualType == TypeCode.Float
        // Special provisions for dynamic data
        ||
        actualType == TypeCode.Double ||
        actualType == TypeCode.Integer ||
        actualType == TypeCode.Long;
  } else if (expectedType == 'double') {
    return actualType == TypeCode.Double
        // Special provisions for dynamic data
        ||
        actualType == TypeCode.Float;
  } else if (expectedType == 'string') {
    return actualType == TypeCode.String;
  } else if (expectedType == 'bool' || expectedType == 'boolean') {
    return actualType == TypeCode.Boolean;
  } else if (expectedType == 'date' || expectedType == 'datetime') {
    return actualType == TypeCode.DateTime
        // Special provisions for dynamic data
        ||
        (actualType == TypeCode.String &&
            DateTimeConverter.toNullableDateTime(actualValue) != null);
  } else if (expectedType == 'timespan' || expectedType == 'duration') {
    return actualType == TypeCode.Duration
        // Special provisions for dynamic data
        ||
        actualType == TypeCode.Integer ||
        actualType == TypeCode.Long;
  } else if (expectedType == 'enum') {
    return actualType == TypeCode.Integer || actualType == TypeCode.String;
  } else if (expectedType == 'map' ||
      expectedType == 'dict' ||
      expectedType == 'dictionary') {
    return actualType == TypeCode.Map;
  } else if (expectedType == 'array' || expectedType == 'list') {
    return actualType == TypeCode.Array;
  } else if (expectedType.endsWith('[]')) {
    // Todo: Check subtype
    return actualType == TypeCode.Array;
  } else {
    return false;
  }
}