| 1 | using CascadeIDE.Models; |
| 2 | |
| 3 | namespace CascadeIDE.Features.UiChrome; |
| 4 | |
| 5 | /// <summary> |
| 6 | /// Пороги <c>[loc_limits]</c> из merged <c>workspace.toml</c> (бандл + <c>.cascade/workspace.toml</c>). |
| 7 | /// Low: loc < <see cref="MediumMin"/>; Medium: <see cref="MediumMin"/> <= loc < <see cref="HighMin"/>; High: loc >= <see cref="HighMin"/>. |
| 8 | /// </summary> |
| 9 | public static class LocLimitsRuntime |
| 10 | { |
| 11 | public const int DefaultMediumMin = 300; |
| 12 | public const int DefaultHighMin = 800; |
| 13 | |
| 14 | /// <summary>Нижняя граница Medium (непустые строки).</summary> |
| 15 | public static int MediumMin { get; private set; } = DefaultMediumMin; |
| 16 | |
| 17 | /// <summary>Нижняя граница High (непустые строки).</summary> |
| 18 | public static int HighMin { get; private set; } = DefaultHighMin; |
| 19 | |
| 20 | internal static void ResetToCodeDefaults() |
| 21 | { |
| 22 | MediumMin = DefaultMediumMin; |
| 23 | HighMin = DefaultHighMin; |
| 24 | } |
| 25 | |
| 26 | internal static void ApplyWorkspaceToml(Features.Workspace.RepositoryWorkspaceToml? w) |
| 27 | { |
| 28 | ResetToCodeDefaults(); |
| 29 | var limits = w?.LocLimits; |
| 30 | if (limits is null) |
| 31 | return; |
| 32 | |
| 33 | var m = limits.MediumMin ?? DefaultMediumMin; |
| 34 | var h = limits.HighMin ?? DefaultHighMin; |
| 35 | if (m < 1 || h < 1 || m >= h) |
| 36 | { |
| 37 | global::System.Diagnostics.Debug.WriteLine( |
| 38 | $"LocLimitsRuntime: invalid loc_limits (medium_min={m}, high_min={h}) — using defaults {DefaultMediumMin}/{DefaultHighMin}."); |
| 39 | return; |
| 40 | } |
| 41 | |
| 42 | MediumMin = m; |
| 43 | HighMin = h; |
| 44 | } |
| 45 | |
| 46 | public static LocSizeTier TierFor(int nonEmptyLineCount) |
| 47 | { |
| 48 | if (nonEmptyLineCount < MediumMin) |
| 49 | return LocSizeTier.Low; |
| 50 | if (nonEmptyLineCount < HighMin) |
| 51 | return LocSizeTier.Medium; |
| 52 | return LocSizeTier.High; |
| 53 | } |
| 54 | } |
| 55 | |