inferType method
Future<String>
inferType(
- DartType type, {
- required String visibleTypeName(
- InterfaceType
- required String renderType(
- InterfaceType
- required Future<
String?> resolveNamed(- InterfaceType
- required Never unsupported(
- DartType
- required void rejectNullableCollectionElement(
- DartType
- required void validateMapKey(
- 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);
}