writeFile method
writes the targetPath content using the sourcePath's content and
replacing the variables and partials with their configured values
outOfFileVariables are variables that are not configured in the
brick_oven.yaml file, they are variables from the brick_oven project
outOfFileVariables are not included in the sync
(brick.yaml or brick_oven.yaml) list
Implementation
FileWriteResult writeFile({
required String targetPath,
required String sourcePath,
required Iterable<Variable> variables,
required Iterable<Variable> outOfFileVariables,
required Iterable<Partial> partials,
}) {
final targetFile = di<FileSystem>().file(targetPath)
..createSync(recursive: true);
final sourceFile = di<FileSystem>().file(sourcePath);
if (!sourceFile.existsSync()) {
di<Logger>().err(
'${sourceFile.path} does not exist, please provide the correct path',
);
return const FileWriteResult.empty();
}
if (variables.isEmpty && partials.isEmpty) {
sourceFile.copySync(targetFile.path);
return const FileWriteResult.empty();
}
// ignore: parameter_assignments
variables = [...variables, ...outOfFileVariables];
/// used to check if variable/partials is goes unused
final usedVariables = <String>{};
final usedPartials = <String>{};
if (!sourceFile.existsSync()) {
di<Logger>().warn('source file does not exist: ${sourceFile.path}');
return const FileWriteResult.empty();
}
var content = sourceFile.readAsStringSync();
for (final variable in variables) {
// formats the content
final sectionResult = checkForSections(content, variable);
content = sectionResult.content;
usedVariables.addAll(sectionResult.used);
final variableResult = checkForVariables(content, variable);
content = variableResult.content;
usedVariables.addAll(variableResult.used);
}
final partialsResult =
checkForPartials(partials: partials, content: content);
content = partialsResult.content;
usedPartials.addAll(partialsResult.used);
final ignoreVariables = {
...outOfFileVariables.map((v) => v.name),
Constants.kIndexValue,
};
final variableNames = variables.map((v) => v.name).toSet();
final unusedVariables =
variableNames.difference({...usedVariables, ...ignoreVariables});
if (unusedVariables.isNotEmpty) {
final vars = '"${unusedVariables.map((e) => e).join('", "')}"';
di<Logger>().warn(
'Unused variables ($vars) in `${sourceFile.path}`',
);
}
targetFile.writeAsStringSync(content);
return FileWriteResult(
usedVariables: usedVariables.toSet(),
usedPartials: usedPartials.toSet(),
);
}