build method

  1. @override
Future build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future build(BuildStep buildStep) async {
  final inputId = buildStep.inputId;
  banner('running: SchemaBuilder on $inputId');

  final xFile = File(inputId.addExtension('.x.dart').path);

  final parts = inputId.pathSegments.last.split('.');
  final name = parts[0];
  final version = (parts[1] != 'schema') ? parts[1] : null;
  final contents = await buildStep.readAsString(inputId);

  final lines = LineSplitter.split(contents).map((line) {
    return line.replaceAllMapped(RegExp(r'{{\s*(.*?)\s*}}'), (m) {
      final name = m.group(1)!;
      final value = Platform.environment[name];
      if(value == null) {
        print('environment variable "$name" is not set');
        return m.group(0)!;
      } else {
        print('"$name" -> "$value"');
        return value;
      }
    });
  });

  final schema = SchemaParser().parse(name, version, lines);

  final xSource = read(xFile);
  final sources = <String>[];
  for(final import in schema.imports) {
    final assetId = AssetId(import.package, import.path);
    final unit = await buildStep.resolver.compilationUnitFor(assetId);
    sources.add(unit.toSource());
  }

  schema.isEnum = (type) => [xSource, ...sources].any((s) => s.containsEnum(type));
  schema.isInPart = (type) => xSource.containsClass(type);

  final genId = inputId.addExtension('.g.dart');
  final genSrc = genLibrary(schema);
  await buildStep.writeAsString(genId, tryFormat(genSrc));

  if(schema.has<ConsoleFeature>()) {
    final id = inputId.addExtension('.g.feature_console.dart');
    final src = genConsole(schema);
    await buildStep.writeAsString(id, tryFormat(src));
  }

  if(schema.has<PersistFeature>()) {
    final id = inputId.addExtension('.g.feature_persist.dart');
    final src = genPersist(schema);
    await buildStep.writeAsString(id, tryFormat(src));
  }

  if(schema.has<RestFeature>()) {
    final id = inputId.addExtension('.g.feature_rest.dart');
    final src = genRest(schema);
    await buildStep.writeAsString(id, tryFormat(src));
  }

  if(schema.has<TriggerFeature>()) {
    final id = inputId.addExtension('.g.feature_trigger.dart');
    final src = genTrigger(schema);
    await buildStep.writeAsString(id, tryFormat(src));
  }

  write(xFile.path, schema.partOfDeclaration, overwrite: false);
}