build method

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

Generates the outputs for a given BuildStep.

Implementation

@override
FutureOr<void> build(BuildStep buildStep) async {
  final inputId = buildStep.inputId;
  final source = await buildStep.readAsString(inputId);
  final yaml = y.loadYaml(source);
  if (yaml is! Map) {
    throw StateError('Expected YAML map but got ${yaml.runtimeType}');
  }

  var classes = {};
  if (yaml.containsKey('classes')) {
    classes = _getValue<Map>(yaml, 'classes');
  }

  var directives = [];
  if (yaml.containsKey('directives')) {
    directives = _getValue<List>(yaml, 'directives');
  }

  var serializers = {};
  if (yaml.containsKey('serializers')) {
    serializers = _getValue<Map>(yaml, 'serializers');
  }

  final g = JsonSerializerGenerator();
  var classesCode = '';
  if (classes.isNotEmpty) {
    classesCode = g.generateClasses(
      classes,
      serializers: serializers,
    );
  }

  var serializersCode = '';
  if (serializers.isNotEmpty) {
    serializersCode = g.generateSerializers(
      serializers,
    );
  }

  var directivesCode = '';
  if (directives.isNotEmpty) {
    directivesCode = directives.join('\n');
  }

  final values = {
    'classes': classesCode,
    'directives': directivesCode,
    'serializers': serializersCode,
  };
  var result = g.render(_template, values);
  result = g.format(result);
  final outputId = inputId.changeExtension('.dart');
  await buildStep.writeAsString(outputId, result);
}