build method
Generates the outputs for a given BuildStep
.
Implementation
@override
Future<void> build(BuildStep buildStep) async {
final descriptionsYaml =
loadYaml(await buildStep.readAsString(buildStep.inputId)) as Map;
final descriptions = <Description>[
for (final name in descriptionsYaml.keys.cast<String>().toList()..sort())
if (descriptionsYaml[name] is! Map)
throw Exception('Non-map entry: $name')
else
Description.parse(name, descriptionsYaml[name] as Map)
];
final hasCollection = descriptions.any((d) => d.hasCollectionField);
final enumWireTypes = {
for (final description in descriptions)
if (description is EnumType) description.name: description.wireType
};
final result = <Spec>[
for (final description in descriptions)
...description.implementation(enumWireTypes),
_hashMethods,
if (hasCollection) _deepEquals,
];
final library = Library((b) => b.body.addAll(result));
final emitter = DartEmitter(
allocator: Allocator.simplePrefixing(), useNullSafetySyntax: true);
final content = DartFormatter().format(library.accept(emitter).toString());
await buildStep.writeAsString(
buildStep.inputId.changeExtension('.dart'), '// @dart=2.12\n$content');
}