1using System.Collections.Concurrent;
2using System.Security.Cryptography.X509Certificates;
11 internal static class Utilities
18 public static void RunInStatusContext(
string initialStatus, Action<StatusContext> action)
22 .Spinner(Spinner.Known.Default)
23 .Start(initialStatus, action);
38 public static bool IsFileWithinRoot(
string filePath,
string rootPath)
41 string absoluteFilePath = Path.GetFullPath(filePath);
42 string absoluteRootPath = Path.GetFullPath(rootPath);
45 if (!absoluteRootPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
47 absoluteRootPath += Path.DirectorySeparatorChar;
51 return absoluteFilePath.StartsWith(absoluteRootPath, StringComparison.OrdinalIgnoreCase);
61 public static IEnumerable<string> SafeEnumerateFiles(
string path,
string searchPattern,
bool recursive =
true)
63 ConcurrentQueue<string> folders =
new();
64 folders.Enqueue(path);
66 while (!folders.IsEmpty)
68 if (!folders.TryDequeue(out
string? currentDir))
continue;
70 string[] subDirs = Array.Empty<
string>();
71 string[] files = Array.Empty<
string>();
75 files = Directory.GetFiles(currentDir, searchPattern);
77 catch (UnauthorizedAccessException) { }
78 catch (DirectoryNotFoundException) { }
80 foreach (
string file
in files)
89 subDirs = Directory.GetDirectories(currentDir);
92 catch (UnauthorizedAccessException) {
continue; }
93 catch (DirectoryNotFoundException) {
continue; }
95 foreach (
string dir
in subDirs)
107 public static string SecurePrompt(
string prompt)
109 return AnsiConsole.Prompt(
110 new TextPrompt<string>(prompt)
120 public static void EnumerateStatuses(X509ChainStatus[] statuses)
122 foreach (X509ChainStatus status
in statuses)
124 AnsiConsole.MarkupLine($
"[{Color.IndianRed}] {status.StatusInformation}[/]");
138 public static bool ParseToBool(
string input)
140 if (
int.TryParse(input, out
int number))
144 if (
bool.TryParse(input, out
bool boolean))
149 throw new FormatException($
"Cannot convert '{input}' to a boolean.");