generate method
Future<void>
generate(
- List<
IModuleCodeContributor> modules, - Logger logger,
- Map<
String, dynamic> coreVars, - String generateTo,
override
Generates files based on provided modules and context.
Implementation
@override
Future<void> generate(
List<IModuleCodeContributor> modules,
Logger logger,
Map<String, dynamic> coreVars,
String generateTo,
) async {
final disabledModules = <IModuleCodeContributor>{};
for (final module in modules) {
for (final brick in module.brickContributions) {
if (disabledModules.contains(module)) continue;
final generator = await MasonGenerator.fromBundle(brick.bundle);
final target = DirectoryGeneratorTarget(Directory(generateTo));
final vars = coreVars..addAll(brick.vars ?? {});
try {
await generator.hooks.preGen(
vars: vars,
onVarsChanged: vars.addAll,
logger: logger,
);
final generateProgress = logger.progress(
'Generating from ${brick.name}',
);
final files = await generator.generate(
target,
vars: vars,
fileConflictResolution: mapMergeStrategy(brick.mergeStrategy),
logger: logger,
);
generateProgress.complete('Generated ${files.length} file(s)');
await generator.hooks.postGen(vars: vars, logger: logger);
} on Exception catch (e) {
final isStrict = coreVars['strict_mode'] == true;
if (isStrict) {
logger.err(
'❌ Error in module ${module.moduleDescriptor.name}',
);
rethrow;
} else {
logger.detail(
'Error during pre-generation for module '
"'${module.moduleDescriptor.name}': $e",
);
disabledModules
..add(module)
..addAll(
moduleResolver.dependentsOf(module, modules),
);
}
}
}
}
if (disabledModules.isNotEmpty) {
final excludedNames =
disabledModules.map((m) => m.moduleDescriptor.name).join(', ');
logger
..info('⚠️ ⚠️ ⚠️ Generation warnings ⚠️ ⚠️ ⚠️')
..info(
' Errors occurred during generation.\n'
' Excluding the following modules (and their dependents):\n'
' $excludedNames',
)
..info('⚠️ ⚠️ ⚠️ End of warnings ⚠️ ⚠️ ⚠️');
modules.removeWhere(disabledModules.contains);
}
}