parse method

EntityResult parse(
  1. Map<String, dynamic> json,
  2. String name, {
  3. String? parentPrefix,
})

Implementation

EntityResult parse(
  Map<String, dynamic> json,
  String name, {
  String? parentPrefix,
}) {
  final fullName = prefixNested && parentPrefix != null
      ? '$parentPrefix$name'
      : name;
  final fields = <Field>[];
  final nested = <EntityResult>[];

  for (final entry in json.entries) {
    final key = entry.key;
    final value = entry.value;

    final isNullable = key.endsWith('?');
    final fieldName = isNullable ? key.substring(0, key.length - 1) : key;

    if (value is Map<String, dynamic>) {
      // Nested object
      final nestedName = _toPascal(fieldName);
      final nestedResult = parse(
        value,
        nestedName,
        parentPrefix: prefixNested ? fullName : null,
      );
      nested.add(nestedResult);
      fields.add(Field(fieldName, '\$${nestedResult.name}', isNullable));
    } else if (value is List && value.isNotEmpty && value.first is Map) {
      // List of objects
      final nestedName = _toPascal(_singularize(fieldName));
      final nestedResult = parse(
        value.first as Map<String, dynamic>,
        nestedName,
        parentPrefix: prefixNested ? fullName : null,
      );
      nested.add(nestedResult);
      fields.add(
        Field(fieldName, 'List<\$${nestedResult.name}>', isNullable),
      );
    } else {
      // Primitive
      final type = _inferType(value);
      fields.add(Field(fieldName, type, isNullable || value == null));
    }
  }

  return EntityResult(fullName, fields, nested);
}