resolveStatusLineSpec function

StatusLineSpec resolveStatusLineSpec(
  1. StatusLineConfig? config, {
  2. void warn(
    1. String message
    )?,
})

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,
  );
}