build method

  1. @override
Future<void> build(
  1. BuildStep buildStep
)

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');
}