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