generateApiCode function

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

Implementation

SimpleDartCode generateApiCode(IMap<String, GraphQLRootObject> apiMap) {
  // 同じ型の名前で構造が同じものかどうか調べるために Map を使う
  final objectTypeList = apiMap.values.expand(
    (element) => _collectObjectType(element).toEntryList(),
  );
  final objectTypeMapMut = Map<String, GraphQLObjectType>();
  for (final objectType in objectTypeList) {
    final mapValue = objectTypeMapMut[objectType.key];
    if (mapValue == null) {
      objectTypeMapMut[objectType.key] = objectType.value;
    } else {
      if (mapValue != objectType.value) {
        throw Exception('同じ型の名前なのに構造が違う ${objectType.key}');
      }
    }
  }
  final objectTypeMap = objectTypeMapMut.lock;

  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),
        )
    ]),
  );
}