typeDefinitionCode method

String typeDefinitionCode()

Implementation

String typeDefinitionCode() {
  final hasTypeParams = typeParams.isNotEmpty;
  final _typeParamsStr = typeParams.map((e) {
    final _t = e.displayName;
    return 'GraphQLType<$_t, Object> ${ReCase(_t).camelCase}$graphqlTypeSuffix,';
  }).join();

  final _type =
      'GraphQL${isInput ? 'Input' : ''}ObjectType<$typeName${_typeList()}>';

  final _typeNoExt = 'GraphQL${isInput ? 'Input' : ''}ObjectType<$typeName>';
  final _cacheGetter = hasTypeParams ? '_$fieldName.value[__name]' : null;
  final _genericSerializer = hasTypeParams && hasFromJson;

  final body = '''
{
final __name = ${hasTypeParams ? 'name ?? ' : ''}'$graphQLTypeName';
${hasTypeParams ? 'if ($_cacheGetter != null) return $_cacheGetter! as $_type;' : ''}
final __$fieldName = ${expression().accept(DartEmitter())};
${_genericSerializer ? _setGenericSerializer() : ''}
${hasTypeParams ? '$_cacheGetter = __$fieldName;' : 'setValue(__$fieldName);'}
__$fieldName.fields.addAll(${literalList(
    () {
      // deduplicate field names
      final _getters = <String>{};
      final _names = <String>{};
      return fields
          .where((e) =>
              _getters.add(e.getter) &&
              (_names.add(e.name) || e.fieldAnnot.name != null) &&
              e.fieldAnnot.omit != true)
          .map((e) => e.expression(isInput: isInput));
    }(),
  ).accept(DartEmitter())},);

return __$fieldName;
}''';

  if (hasTypeParams) {
    return '''
${_genericSerializer ? 'final ${ReCase(typeName).camelCase}SerdeCtx = SerdeCtx();' : ''}
final _$fieldName = HotReloadableDefinition<Map<String, $_typeNoExt>>((_) => {});
/// Auto-generated from [$typeName].
$_type $fieldName${_typeList(ext: true)}($_typeParamsStr {String? name,}) $body
''';
  } else {
    return '''
final _$fieldName = HotReloadableDefinition<$_type>((setValue) $body);
/// Auto-generated from [$typeName].
$_type get $fieldName => _$fieldName.value;
''';
  }
}