Forge
csharpdeeb25a2
1namespace CascadeIDE.Services;
2
3/// <summary>
4/// Точечный резолв строк settings.toml: <c>&lt;field&gt;_env</c> → литерал или sentinel (ADR 0149).
5/// </summary>
6public static class SettingsEnvResolver
7{
8 /// <summary>Явное намерение «искать команду в PATH», не читать переменную <c>PATH</c> (ADR 0149 §2.1).</summary>
9 public const string PathLookupSentinel = "PATH";
10
11 /// <summary>Значение для runtime: именованная env → литерал. Sentinel <see cref="PathLookupSentinel"/> здесь не обрабатывается.</summary>
12 public static string Resolve(string? literal, string? environmentVariableName) =>
13 TryResolve(literal, environmentVariableName, out var value, out _)
14 ? value
15 : literal ?? "";
16
17 /// <summary>
18 /// Путь/команда к процессу (LSP <c>executable</c>, ACP): <c>executable_env = "PATH"</c> → пустая строка (далее пресет + PATH);
19 /// иначе именованная переменная → литерал.
20 /// </summary>
21 public static string ResolveLaunchPath(string? literal, string? environmentVariableName)
22 {
23 if (IsPathLookupSentinel(environmentVariableName))
24 return "";
25
26 return Resolve(literal, environmentVariableName);
27 }
28
29 /// <summary>Как <see cref="Resolve"/>, плюс флаг «взято из именованной переменной окружения».</summary>
30 public static bool TryResolve(
31 string? literal,
32 string? environmentVariableName,
33 out string value,
34 out bool fromEnvironment)
35 {
36 if (IsPathLookupSentinel(environmentVariableName))
37 {
38 value = "";
39 fromEnvironment = false;
40 return false;
41 }
42
43 var fromEnv = TryGetEnvironmentValue(environmentVariableName);
44 if (fromEnv is not null)
45 {
46 value = fromEnv;
47 fromEnvironment = true;
48 return true;
49 }
50
51 value = literal ?? "";
52 fromEnvironment = false;
53 return !string.IsNullOrEmpty(value);
54 }
55
56 public static bool IsPathLookupSentinel(string? environmentVariableName) =>
57 string.Equals(environmentVariableName?.Trim(), PathLookupSentinel, StringComparison.OrdinalIgnoreCase);
58
59 /// <summary>Непустое значение **именованной** переменной или <see langword="null"/>.</summary>
60 public static string? TryGetEnvironmentValue(string? environmentVariableName)
61 {
62 if (string.IsNullOrWhiteSpace(environmentVariableName) || IsPathLookupSentinel(environmentVariableName))
63 return null;
64
65 var raw = Environment.GetEnvironmentVariable(environmentVariableName.Trim());
66 if (string.IsNullOrWhiteSpace(raw))
67 return null;
68
69 return raw.Trim();
70 }
71}
72
View only · write via MCP/CIDE