resolveStatusLineSpec function
Resolves a (possibly null) parsed config into a concrete
StatusLineSpec: the preset's groups/separator/options as the base,
the user's left:/right:/separator:/segmentOptions:/
transparent: overrides merged on top. Explicit left:/right:
without a preset: implies the custom base. Unknown segment ids are
dropped with one warn line each — never a boot failure (the
tools:-scopes rule, E7).
Implementation
StatusLineSpec resolveStatusLineSpec(
StatusLineConfig? config, {
void Function(String message)? warn,
}) {
final hasCustomGroups = config?.left != null || config?.right != null;
final presetName = config?.preset ?? (hasCustomGroups ? 'custom' : 'default');
final preset = kStatusLinePresets[presetName];
if (preset == null) {
throw ConfigException(
'unknown "tui.statusLine" preset: $presetName '
'(known: ${kStatusLinePresetNames.join(', ')})',
);
}
List<String> kept(List<String>? configured, List<String> fallback) {
final ids = configured ?? fallback;
for (final id in ids) {
if (!kStatusLineSegmentIds.contains(id)) {
warn?.call(
'config tui.statusLine: unknown segment id "$id" — ignored '
'(known: ${kStatusLineSegmentIds.join(', ')})',
);
}
}
return [
for (final id in ids)
if (kStatusLineSegmentIds.contains(id)) id,
];
}
return StatusLineSpec(
left: kept(config?.left, preset.left),
right: kept(config?.right, preset.right),
separator: config?.separator ?? preset.separator,
nerdSymbols: config?.nerdSymbols ?? preset.nerd,
transparent: config?.transparent ?? false,
options:
config?.segmentOptions?.mergedOver(preset.options) ?? preset.options,
);
}