generateApiCode function

SimpleDartCode generateApiCode(
  1. IMap<String, GraphQLRootObject> apiMap
)

Implementation

SimpleDartCode generateApiCode(IMap<String, GraphQLRootObject> apiMap) {
  final objectTypeList = apiMap.values.expand(
    (element) => _collectObjectType(element),
  );
  final groupedSetMap = objectTypeList.groupSetsBy((tuple) => tuple.$1);

  final objectTypeMap = IMap.fromEntries(groupedSetMap.entries.map((entry) {
    if (1 < entry.value.length) {
      throw Exception(
        '同じ型の名前なのに構造が違う ${entry.key} \n${entry.value.mapIndexed((index, tuple) => '\n$index:\n' + queryFieldListToStringLoop(tuple.$2, 1)).safeJoin('\n')}',
      );
    }
    return MapEntry(entry.key, entry.value.first.$2);
  }));

  return SimpleDartCode(
    importPackageAndFileNames: IList([
      const ImportPackageFileNameAndAsName(
        packageAndFileName:
            'package:simple_graphql_client_gen/graphql_post.dart',
        asName: 'graphql_post',
      ),
      const ImportPackageFileNameAndAsName(
        packageAndFileName: 'package:narumincho_json/narumincho_json.dart',
        asName: 'narumincho_json',
      ),
      const ImportPackageFileNameAndAsName(
        packageAndFileName: './type.dart',
        asName: 'type',
      ),
    ]),
    declarationList: IList([
      ClassDeclaration(
        name: 'Api',
        documentationComments: 'APIを呼ぶ',
        fields: const IListConst([]),
        modifier: ClassModifier.abstract,
        methods: IList(
          apiMap.mapTo(
            (apiName, objectType) => _createApiCallMethod(
              apiName,
              objectType,
            ),
          ),
        ),
      ),
      for (final objectType in objectTypeMap.values)
        ..._objectTypeClassDeclaration(
          objectType,
          IList(objectTypeMap.values),
        )
    ]),
  );
}