build method
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);
}