parse static method
Reads the config, expanding platformOnlyKeys, tenantKeys and allBut:
against the keys the Blueprint uses (allKeys).
Implementation
static RoleModel parse(String configYaml, Set<String> allKeys) {
final cfg = loadYaml(configYaml) as YamlMap;
final platformOnly = {
for (final k in cfg['platformOnlyKeys'] as YamlList) '$k',
};
final tenant = allKeys.difference(platformOnly);
final roleKeys = <String, Set<String>>{};
(cfg['roleKeys'] as YamlMap).forEach((role, keys) {
final set = <String>{};
for (final k in keys as YamlList) {
if (k == 'platformOnlyKeys') {
set.addAll(platformOnly);
} else if (k == 'tenantKeys') {
set.addAll(tenant);
} else {
set.add('$k');
}
}
roleKeys['$role'] = set;
});
final roles = roleKeys.keys.toSet();
Set<String> roleSet(Object? v) => v is YamlMap
? roles.difference({for (final r in v['allBut'] as YamlList) '$r'})
: {for (final r in v as YamlList) '$r'};
final handlers = <String, Set<String>>{};
(cfg['handlerRoles'] as YamlMap).forEach(
(h, v) => handlers['$h'] = roleSet(v),
);
final actors = <String, Set<String>>{};
(cfg['actorRoles'] as YamlMap).forEach((a, v) => actors['$a'] = roleSet(v));
return RoleModel(
roleKeys,
handlers,
actors,
{for (final o in cfg['otherActorOperations'] as YamlList) '$o'},
[for (final q in cfg['pendingQuestions'] as YamlList) '$q'],
);
}