inferType method

Future<String> inferType(
  1. DartType type, {
  2. required String visibleTypeName(
    1. InterfaceType
    ),
  3. required String renderType(
    1. InterfaceType
    ),
  4. required Future<String?> resolveNamed(
    1. InterfaceType
    ),
  5. required Never unsupported(
    1. DartType
    ),
  6. required void rejectNullableCollectionElement(
    1. DartType
    ),
  7. required void validateMapKey(
    1. InterfaceType
    ),
})

Infers a schema expression for type.

resolveNamed returns a schema expression for an application type. Return null when the type has no supported model contract.

Implementation

Future<String> inferType(
  DartType type, {
  required String Function(InterfaceType) visibleTypeName,
  required String Function(InterfaceType) renderType,
  required Future<String?> Function(InterfaceType) resolveNamed,
  required Never Function(DartType) unsupported,
  required void Function(DartType) rejectNullableCollectionElement,
  required void Function(InterfaceType) validateMapKey,
}) async {
  if (type is! InterfaceType) return unsupported(type);
  final scalar = _scalar(type);
  if (scalar != null) return scalar;
  if (type.element is EnumElement) {
    return '${_ack('Ack')}.enumValues(${visibleTypeName(type)}.values)';
  }
  if (type.isDartCoreList && type.typeArguments.length == 1) {
    final item = type.typeArguments.single;
    if (_nullable(item)) rejectNullableCollectionElement(item);
    return '${_ack('Ack')}.list(${await inferType(item, visibleTypeName: visibleTypeName, renderType: renderType, resolveNamed: resolveNamed, unsupported: unsupported, rejectNullableCollectionElement: rejectNullableCollectionElement, validateMapKey: validateMapKey)})';
  }
  if (type.isDartCoreSet && type.typeArguments.length == 1) {
    final item = type.typeArguments.single;
    if (_nullable(item)) rejectNullableCollectionElement(item);
    final itemSchema = await inferType(
      item,
      visibleTypeName: visibleTypeName,
      renderType: renderType,
      resolveNamed: resolveNamed,
      unsupported: unsupported,
      rejectNullableCollectionElement: rejectNullableCollectionElement,
      validateMapKey: validateMapKey,
    );
    return '${_ack('Ack')}.list($itemSchema).codec<${renderType(type)}>(decode: (list) => list.toSet(), encode: (set) => set.toList(growable: false),)';
  }
  if (type.isDartCoreMap) {
    validateMapKey(type);
    final value = type.typeArguments[1];
    final valueSchema = await inferType(
      value,
      visibleTypeName: visibleTypeName,
      renderType: renderType,
      resolveNamed: resolveNamed,
      unsupported: unsupported,
      rejectNullableCollectionElement: rejectNullableCollectionElement,
      validateMapKey: validateMapKey,
    );
    return '${_ack('Ack')}.map($valueSchema${_nullable(value) ? '.nullable()' : ''})';
  }
  return await resolveNamed(type) ?? unsupported(type);
}