Forge
csharp4405de34
1#nullable enable
2
3using CascadeIDE.Features.Chat;
4
5namespace CascadeIDE.Services.Intercom;
6
7/// <summary>Разбор хвоста <c>/intercom message … relate …</c> (ADR 0137 contiguous, 0138 disjoint).</summary>
8public static class IntercomMessageRelateArgs
9{
10 public static bool TryParse(
11 string? tail,
12 out IReadOnlyList<ParametricIntRange> segments,
13 out string codeRefTail,
14 out string error)
15 {
16 segments = [];
17 codeRefTail = "";
18 error = "";
19
20 var text = (tail ?? "").Trim();
21 if (text.Length == 0)
22 {
23 error = "Укажи диапазон сообщений и фрагмент кода: «3:5 relate selection», «3:5 relate M:Foo» или «[3;5] [8;15] relate selection».";
24 return false;
25 }
26
27 string rangePart;
28 string codePart;
29 var relateIdx = text.IndexOf(" relate ", StringComparison.OrdinalIgnoreCase);
30 if (relateIdx >= 0)
31 {
32 rangePart = text[..relateIdx].Trim();
33 codePart = text[(relateIdx + " relate ".Length)..].Trim();
34 }
35 else
36 {
37 var space = text.IndexOf(' ');
38 if (space < 0)
39 {
40 error = "После диапазона сообщений укажи фрагмент кода (selection, L:…, [M:…]).";
41 return false;
42 }
43
44 rangePart = text[..space].Trim();
45 codePart = text[(space + 1)..].Trim();
46 }
47
48 if (rangePart.Length == 0 || codePart.Length == 0)
49 {
50 error = "Укажи диапазон gutter (1-based) и фрагмент кода.";
51 return false;
52 }
53
54 if (!ParametricSegmentListParser.TryParse(rangePart, out segments, out error))
55 return false;
56
57 codeRefTail = codePart;
58 return true;
59 }
60
61 /// <summary>Contiguous-only parse (legacy callers).</summary>
62 public static bool TryParse(
63 string? tail,
64 out int startOrdinal,
65 out int endOrdinal,
66 out string codeRefTail,
67 out string error)
68 {
69 startOrdinal = 0;
70 endOrdinal = 0;
71 codeRefTail = "";
72 if (!TryParse(tail, out var segments, out codeRefTail, out error))
73 return false;
74
75 if (segments.Count != 1)
76 {
77 error = segments.Count == 0
78 ? "Пустой диапазон."
79 : "Ожидается один contiguous сегмент (например 3:5). Для disjoint используйте [3;5] [8;15].";
80 return false;
81 }
82
83 startOrdinal = segments[0].Start;
84 endOrdinal = segments[0].End;
85 return true;
86 }
87}
88
View only · write via MCP/CIDE