Forge
csharpdeeb25a2
1#nullable enable
2using CascadeIDE.Contracts;
3namespace CascadeIDE.Features.Workspace.DataAcquisition;
4
5/// <summary>Разрешение пути к <c>.sln</c> из аргумента MCP <c>workspace_path</c> (каталог, файл решения или произвольный файл в дереве).</summary>
6[IoBoundary]
7public static class DebugWorkspacePath
8{
9 /// <summary>
10 /// Если путь указывает на <c>.sln/.slnx/.slnf</c> — возвращает его; если на каталог — ищет решение в нём;
11 /// если на другой файл — ищет решение в каталоге файла.
12 /// </summary>
13 public static string? TryResolveWorkspaceToSolutionPath(string? workspacePath)
14 {
15 if (string.IsNullOrWhiteSpace(workspacePath))
16 return null;
17
18 var full = CanonicalFilePath.Normalize(workspacePath.Trim());
19 if (File.Exists(full))
20 return TryResolveWhenEntryIsFile(full);
21
22 if (Directory.Exists(full))
23 return SolutionFileLocator.TryFindSolutionInDirectory(full);
24
25 return null;
26 }
27
28 private static string? TryResolveWhenEntryIsFile(string fullPath)
29 {
30 if (IsSolutionFilePath(fullPath))
31 return fullPath;
32
33 var dir = Path.GetDirectoryName(fullPath);
34 return string.IsNullOrEmpty(dir) ? null : SolutionFileLocator.TryFindSolutionInDirectory(dir);
35 }
36
37 private static bool IsSolutionFilePath(string fullPath) =>
38 Path.GetExtension(fullPath) is var ext && IsSolutionFileExtension(ext);
39
40 private static bool IsSolutionFileExtension(string extension) =>
41 extension.Equals(".sln", StringComparison.OrdinalIgnoreCase) ||
42 extension.Equals(".slnx", StringComparison.OrdinalIgnoreCase) ||
43 extension.Equals(".slnf", StringComparison.OrdinalIgnoreCase);
44}
45
View only · write via MCP/CIDE