From 42fa49be738609a82fe8dd760d5f775b0ab333c8 Mon Sep 17 00:00:00 2001 From: Jason Johnston Date: Mon, 11 May 2026 11:33:11 -0400 Subject: [PATCH 1/4] Convert CloudSupportStatus enum to flags To make the split and combining statuses easier --- src/Docs/ApiDocument.cs | 2 +- src/Docs/CloudSupportStatus.cs | 39 +++++++++++---- src/Docs/DocSet.cs | 32 ++++++------- .../OpenApiUrlTreeNodeExtensions.cs | 11 +++-- src/Program.cs | 6 +-- test/DocSetTests.cs | 47 ------------------- 6 files changed, 56 insertions(+), 81 deletions(-) delete mode 100644 test/DocSetTests.cs diff --git a/src/Docs/ApiDocument.cs b/src/Docs/ApiDocument.cs index 7d4300c..d17c731 100644 --- a/src/Docs/ApiDocument.cs +++ b/src/Docs/ApiDocument.cs @@ -217,7 +217,7 @@ private static string GetIncludeLine(CloudSupportStatus status, string includeDi CloudSupportStatus.AllClouds => $"[!INCLUDE [national-cloud-support]({includeDirectory}/all-clouds.md)]", CloudSupportStatus.GlobalAndUSGov => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-us.md)]", CloudSupportStatus.GlobalAndChina => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-china.md)]", - CloudSupportStatus.GlobalOnly => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-only.md)]", + CloudSupportStatus.Global => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-only.md)]", _ => throw new ArgumentException("Invalid cloud support status"), }; } diff --git a/src/Docs/CloudSupportStatus.cs b/src/Docs/CloudSupportStatus.cs index 8748f36..dd75304 100644 --- a/src/Docs/CloudSupportStatus.cs +++ b/src/Docs/CloudSupportStatus.cs @@ -6,30 +6,51 @@ namespace CheckCloudSupport.Docs; /// /// Represents the cloud support status of an API. /// +[Flags] public enum CloudSupportStatus { /// /// Cloud support status is undetermined. /// - Unknown, + Unknown = 0, /// - /// API is supported in all public national clouds. + /// API is supported in Chinese cloud. /// - AllClouds, + China = 1 << 0, /// - /// API is supported in the global and US Government clouds only. + /// API is supported in the global cloud. /// - GlobalAndUSGov, + Global = 1 << 1, /// - /// API is supported in the global and Chinese clouds only. + /// API is supported in the US Government L4 cloud. /// - GlobalAndChina, + USGovL4 = 1 << 2, /// - /// API is supported in the global cloud only. + /// API is supported in the US Government L5 cloud. /// - GlobalOnly, + USGovL5 = 1 << 3, + + /// + /// API is supported in the US Government cloud (L4 and L5). + /// + USGov = USGovL4 | USGovL5, + + /// + /// API is supported in all clouds (China, Global, and US Government). + /// + AllClouds = China | Global | USGov, + + /// + /// API is supported in both Global and US Government clouds. + /// + GlobalAndUSGov = Global | USGov, + + /// + /// API is supported in both Global and Chinese clouds. + /// + GlobalAndChina = Global | China, } diff --git a/src/Docs/DocSet.cs b/src/Docs/DocSet.cs index f3d90c2..f86b59c 100644 --- a/src/Docs/DocSet.cs +++ b/src/Docs/DocSet.cs @@ -44,25 +44,25 @@ public static async Task CreateFromDirectory(string docsRoot) /// The first status. /// The second status. /// The combined status. - public static CloudSupportStatus CombineStatuses(CloudSupportStatus a, CloudSupportStatus b) - { - if (a == b) - { - return a; - } + // public static CloudSupportStatus CombineStatuses(CloudSupportStatus a, CloudSupportStatus b) + // { + // if (a == b) + // { + // return a; + // } - if (a == CloudSupportStatus.Unknown || a == CloudSupportStatus.GlobalOnly) - { - return b == CloudSupportStatus.Unknown ? CloudSupportStatus.GlobalOnly : b; - } + // if (a == CloudSupportStatus.Unknown || a == CloudSupportStatus.GlobalOnly) + // { + // return b == CloudSupportStatus.Unknown ? CloudSupportStatus.GlobalOnly : b; + // } - if (b == CloudSupportStatus.Unknown || b == CloudSupportStatus.GlobalOnly) - { - return a; - } + // if (b == CloudSupportStatus.Unknown || b == CloudSupportStatus.GlobalOnly) + // { + // return a; + // } - return CloudSupportStatus.AllClouds; - } + // return CloudSupportStatus.AllClouds; + // } /// /// Loads the Markdown files in the root directory into the . diff --git a/src/Extensions/OpenApiUrlTreeNodeExtensions.cs b/src/Extensions/OpenApiUrlTreeNodeExtensions.cs index b7b4065..4e915be 100644 --- a/src/Extensions/OpenApiUrlTreeNodeExtensions.cs +++ b/src/Extensions/OpenApiUrlTreeNodeExtensions.cs @@ -135,16 +135,17 @@ public static CloudSupportStatus GetCloudSupportStatus( return CloudSupportStatus.Unknown; } - if (supportsUsGov && supportsChina) + var status = CloudSupportStatus.Global; + if (supportsUsGov) { - return CloudSupportStatus.AllClouds; + status |= CloudSupportStatus.USGov; } - if (!supportsUsGov && !supportsChina) + if (supportsChina) { - return CloudSupportStatus.GlobalOnly; + status |= CloudSupportStatus.China; } - return supportsUsGov ? CloudSupportStatus.GlobalAndUSGov : CloudSupportStatus.GlobalAndChina; + return status; } } diff --git a/src/Program.cs b/src/Program.cs index 5c7501d..b4c8419 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -160,7 +160,7 @@ supportStatus, apiDoc.CloudSupportStatus); - apiDoc.CloudSupportStatus = DocSet.CombineStatuses(apiDoc.CloudSupportStatus, supportStatus); + apiDoc.CloudSupportStatus |= supportStatus; } else { @@ -340,7 +340,7 @@ supportStatus, v1CloudSupportStatus); - v1CloudSupportStatus = DocSet.CombineStatuses(v1CloudSupportStatus, supportStatus); + v1CloudSupportStatus |= supportStatus; } else { @@ -377,7 +377,7 @@ supportStatus, betaCloudSupportStatus); - betaCloudSupportStatus = DocSet.CombineStatuses(betaCloudSupportStatus, supportStatus); + betaCloudSupportStatus |= supportStatus; } else { diff --git a/test/DocSetTests.cs b/test/DocSetTests.cs deleted file mode 100644 index c43c953..0000000 --- a/test/DocSetTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -using CheckCloudSupport.Docs; - -namespace CheckCloudSupportTests; - -public class DocSetTests -{ - public static TheoryData CombineTestData => new() - { - {CloudSupportStatus.Unknown, CloudSupportStatus.Unknown, CloudSupportStatus.Unknown}, - {CloudSupportStatus.Unknown, CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalOnly}, - {CloudSupportStatus.Unknown, CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.Unknown, CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalAndUSGov}, - {CloudSupportStatus.Unknown, CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalAndChina}, - - {CloudSupportStatus.GlobalOnly, CloudSupportStatus.Unknown, CloudSupportStatus.GlobalOnly}, - {CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalOnly}, - {CloudSupportStatus.GlobalOnly, CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalAndUSGov}, - {CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalAndChina}, - - {CloudSupportStatus.AllClouds, CloudSupportStatus.Unknown, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.AllClouds, CloudSupportStatus.GlobalOnly, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.AllClouds, CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.AllClouds, CloudSupportStatus.GlobalAndChina, CloudSupportStatus.AllClouds}, - - {CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.Unknown, CloudSupportStatus.GlobalAndUSGov}, - {CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalAndUSGov}, - {CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalAndUSGov}, - {CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.GlobalAndChina, CloudSupportStatus.AllClouds}, - - {CloudSupportStatus.GlobalAndChina, CloudSupportStatus.Unknown, CloudSupportStatus.GlobalAndChina}, - {CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalOnly, CloudSupportStatus.GlobalAndChina}, - {CloudSupportStatus.GlobalAndChina, CloudSupportStatus.AllClouds, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalAndUSGov, CloudSupportStatus.AllClouds}, - {CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalAndChina, CloudSupportStatus.GlobalAndChina}, - - }; - - [Theory] - [MemberData(nameof(CombineTestData))] - public void CloudStatusesCombineCorrectly(CloudSupportStatus a, CloudSupportStatus b, CloudSupportStatus combined) - { - Assert.Equal(combined, DocSet.CombineStatuses(a, b)); - } -} From e4188d4ab85dbac80b0144211648214d195f38a9 Mon Sep 17 00:00:00 2001 From: Jason Johnston Date: Tue, 12 May 2026 11:05:24 -0400 Subject: [PATCH 2/4] Implement ability to exclude single US Gov clouds --- schema/cloud.exclusions.schema.json | 2 + src/Docs/ApiDocument.cs | 6 +- src/Docs/CloudSupportStatus.cs | 20 ++++++ .../OpenApiUrlTreeNodeExtensions.cs | 57 +++++++++++----- src/Extensions/StringExtensions.cs | 66 +++++++++++++++++-- 5 files changed, 129 insertions(+), 22 deletions(-) diff --git a/schema/cloud.exclusions.schema.json b/schema/cloud.exclusions.schema.json index 7563fff..33999ac 100644 --- a/schema/cloud.exclusions.schema.json +++ b/schema/cloud.exclusions.schema.json @@ -24,6 +24,8 @@ "enum": [ "Global", "UsGov", + "UsGovL4", + "UsGovL5", "China" ] }, diff --git a/src/Docs/ApiDocument.cs b/src/Docs/ApiDocument.cs index d17c731..dbe1f3b 100644 --- a/src/Docs/ApiDocument.cs +++ b/src/Docs/ApiDocument.cs @@ -215,8 +215,12 @@ private static string GetIncludeLine(CloudSupportStatus status, string includeDi return status switch { CloudSupportStatus.AllClouds => $"[!INCLUDE [national-cloud-support]({includeDirectory}/all-clouds.md)]", - CloudSupportStatus.GlobalAndUSGov => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-us.md)]", CloudSupportStatus.GlobalAndChina => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-china.md)]", + CloudSupportStatus.GlobalAndChinaAndUsGovL4 => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-china-us-l4.md)]", + CloudSupportStatus.GlobalAndChinaAndUsGovL5 => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-china-us-l5.md)]", + CloudSupportStatus.GlobalAndUSGov => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-us.md)]", + CloudSupportStatus.GlobalAndUsGovL4 => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-us-l4.md)]", + CloudSupportStatus.GlobalAndUsGovL5 => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-us-l5.md)]", CloudSupportStatus.Global => $"[!INCLUDE [national-cloud-support]({includeDirectory}/global-only.md)]", _ => throw new ArgumentException("Invalid cloud support status"), }; diff --git a/src/Docs/CloudSupportStatus.cs b/src/Docs/CloudSupportStatus.cs index dd75304..ee172f3 100644 --- a/src/Docs/CloudSupportStatus.cs +++ b/src/Docs/CloudSupportStatus.cs @@ -53,4 +53,24 @@ public enum CloudSupportStatus /// API is supported in both Global and Chinese clouds. /// GlobalAndChina = Global | China, + + /// + /// API is supported in both Global and US Government L4 clouds. + /// + GlobalAndUsGovL4 = Global | USGovL4, + + /// + /// API is supported in both Global and US Government L5 clouds. + /// + GlobalAndUsGovL5 = Global | USGovL5, + + /// + /// API is supported in Global, Chinese, and US Government L4 clouds. + /// + GlobalAndChinaAndUsGovL4 = Global | China | USGovL4, + + /// + /// API is supported in Global, Chinese, and US Government L5 clouds. + /// + GlobalAndChinaAndUsGovL5 = Global | China | USGovL5, } diff --git a/src/Extensions/OpenApiUrlTreeNodeExtensions.cs b/src/Extensions/OpenApiUrlTreeNodeExtensions.cs index 4e915be..af17804 100644 --- a/src/Extensions/OpenApiUrlTreeNodeExtensions.cs +++ b/src/Extensions/OpenApiUrlTreeNodeExtensions.cs @@ -118,34 +118,57 @@ public static CloudSupportStatus GetCloudSupportStatus( method = HttpMethod.Get; } - var supportsGlobal = node.PathItems.ContainsKey("Global") && - (node.PathItems["Global"].Operations?.ContainsKey(method) ?? false); - var supportsUsGov = node.PathItems.ContainsKey("UsGov") && - (node.PathItems["UsGov"].Operations?.ContainsKey(method) ?? false) && - !OpenAPIOverrides.CheckIfCloudExcluded(node.Path, method, "UsGov") && - !OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "UsGov"); - var supportsChina = node.PathItems.ContainsKey("China") && - (node.PathItems["China"].Operations?.ContainsKey(method) ?? false) && + var supportStatus = node.PathItems.TryGetValue("Global", out IOpenApiPathItem? globalValue) && + (globalValue.Operations?.ContainsKey(method) ?? false) + ? CloudSupportStatus.Global + : CloudSupportStatus.Unknown; + if (supportStatus == CloudSupportStatus.Unknown) + { + return supportStatus; + } + + if (node.PathItems.TryGetValue("UsGov", out IOpenApiPathItem? usGovValue) && + (usGovValue.Operations?.ContainsKey(method) ?? false)) + { + supportStatus |= GetUsGovCloudSupportStatus(node.Path, method, fileName); + } + + if (node.PathItems.TryGetValue("China", out IOpenApiPathItem? chinaValue) && + (chinaValue.Operations?.ContainsKey(method) ?? false) && !OpenAPIOverrides.CheckIfCloudExcluded(node.Path, method, "China") && - !OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "China"); + !OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "China")) + { + supportStatus |= CloudSupportStatus.China; + } + + return supportStatus; + } + + private static CloudSupportStatus GetUsGovCloudSupportStatus( + string apiPath, + HttpMethod? method, + string fileName) + { + var supportStatus = CloudSupportStatus.USGov; - if (!supportsGlobal) + if (OpenAPIOverrides.CheckIfCloudExcluded(apiPath, method, "UsGov") || + OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "UsGov")) { - // Only process APIs that exist in Global cloud return CloudSupportStatus.Unknown; } - var status = CloudSupportStatus.Global; - if (supportsUsGov) + if (OpenAPIOverrides.CheckIfCloudExcluded(apiPath, method, "UsGovL4") || + OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "UsGovL4")) { - status |= CloudSupportStatus.USGov; + supportStatus &= ~CloudSupportStatus.USGovL4; } - if (supportsChina) + if (OpenAPIOverrides.CheckIfCloudExcluded(apiPath, method, "UsGovL5") || + OpenAPIOverrides.CheckIfCloudExcludedForFile(fileName, "UsGovL5")) { - status |= CloudSupportStatus.China; + supportStatus &= ~CloudSupportStatus.USGovL5; } - return status; + return supportStatus; } } diff --git a/src/Extensions/StringExtensions.cs b/src/Extensions/StringExtensions.cs index 7e8ab7d..7aa8456 100644 --- a/src/Extensions/StringExtensions.cs +++ b/src/Extensions/StringExtensions.cs @@ -37,7 +37,7 @@ public static string NormalizeIdSegments(this string path) normalizedPath = normalizedPath.Replace("/{name}", "/{id}"); // Replace any segments wrapped in braces that contain "id" - normalizedPath = IdSegmentRegex().Replace(normalizedPath, "{id}"); + normalizedPath = IdSegmentRegex().Replace(normalizedPath, "/{id}"); return normalizedPath; } @@ -211,13 +211,65 @@ public static bool IsEqualIgnoringCase(this string value, string compareTo) return compareValue == 0; } - [GeneratedRegex("{[^{}]*id[^{}]*}", RegexOptions.IgnoreCase)] + /// + /// Determines whether the string is a function signature. + /// + /// The string to check. + /// A value indicating whether the string is a function signature. + public static bool IsFunctionSignature(this string value) + { + return FunctionSignatureRegex().IsMatch(value); + } + + /// + /// Gets the variants of a function signature with optional parameters. + /// + /// The function signature segment. + /// An array of function signature variants with optional parameters. + public static string[] VariantsWithOptionalParameters(this string segment) + { + var variants = new List(); + + if (!segment.IsFunctionSignature()) + { + return []; + } + + var parameterListMatches = ParameterListRegex().Matches(segment); + + foreach (var parameterListMatch in parameterListMatches.ToList()) + { + var parameterList = parameterListMatch.Groups[1].Value; + + var parameterValuePairMatches = ParameterValuePairRegex().Matches(parameterList); + + var parameters = new List(); + + foreach (var parameterValuePairMatch in parameterValuePairMatches.ToList()) + { + var parameterName = parameterValuePairMatch.Groups.GetValueOrDefault("param")?.Value; + parameters.Add(parameterName ?? string.Empty); + } + + for (int i = 0; i < parameters.Count; i++) + { + var optionalParameters = parameters.Skip(i).ToArray(); + var optionalParameterString = string.Join(',', optionalParameters.Select(p => $"{p}='{{{p}}}'")); + var variant = segment.Replace(parameterList, optionalParameterString); + variants.Add(variant); + } + } + + return [.. variants]; + } + + [GeneratedRegex("\\/{[^{}]*id[^{}]*}", RegexOptions.IgnoreCase)] private static partial Regex IdSegmentRegex(); - [GeneratedRegex("\\(((?>\\w*='?\\{?[\\w-]*\\}?'?,?)+)\\)")] + [GeneratedRegex("\\(((?>\\w*='?\\{?[\\w@-]*\\}?'?,?)+)\\)")] private static partial Regex ParameterListRegex(); - [GeneratedRegex("(?\\w*)='?(?\\{?[\\w-]*\\}?)'?")] + [GeneratedRegex("(?\\w*)='?(?\\{?[\\w@-]*\\}?)'?")] private static partial Regex ParameterValuePairRegex(); [GeneratedRegex("^\\/users\\/{id}\\/drive\\/")] @@ -243,4 +295,10 @@ public static bool IsEqualIgnoringCase(this string value, string compareTo) [GeneratedRegex("^https://graph.microsoft.com/(?'version'[^/]+)/", RegexOptions.IgnoreCase | RegexOptions.Multiline)] private static partial Regex ApiVersionFromPathRegex(); + + [GeneratedRegex(@"\w+\([\w={},]+\)", RegexOptions.IgnoreCase)] + private static partial Regex FunctionSignatureRegex(); + + [GeneratedRegex(@"(?\w+)=\{(?[^}]+)\}", RegexOptions.IgnoreCase)] + private static partial Regex FunctionParameterRegex(); } From 2240b26acedd74620b9b499ba7fd3052c586e40f Mon Sep 17 00:00:00 2001 From: Jason Johnston Date: Tue, 12 May 2026 11:14:43 -0400 Subject: [PATCH 3/4] Remove unused code --- src/Docs/DocSet.cs | 26 -------------- src/Extensions/StringExtensions.cs | 58 ------------------------------ 2 files changed, 84 deletions(-) diff --git a/src/Docs/DocSet.cs b/src/Docs/DocSet.cs index f86b59c..d0ef491 100644 --- a/src/Docs/DocSet.cs +++ b/src/Docs/DocSet.cs @@ -38,32 +38,6 @@ public static async Task CreateFromDirectory(string docsRoot) return docSet; } - /// - /// Combines two into the most inclusive value. - /// - /// The first status. - /// The second status. - /// The combined status. - // public static CloudSupportStatus CombineStatuses(CloudSupportStatus a, CloudSupportStatus b) - // { - // if (a == b) - // { - // return a; - // } - - // if (a == CloudSupportStatus.Unknown || a == CloudSupportStatus.GlobalOnly) - // { - // return b == CloudSupportStatus.Unknown ? CloudSupportStatus.GlobalOnly : b; - // } - - // if (b == CloudSupportStatus.Unknown || b == CloudSupportStatus.GlobalOnly) - // { - // return a; - // } - - // return CloudSupportStatus.AllClouds; - // } - /// /// Loads the Markdown files in the root directory into the . /// diff --git a/src/Extensions/StringExtensions.cs b/src/Extensions/StringExtensions.cs index 7aa8456..acd3db1 100644 --- a/src/Extensions/StringExtensions.cs +++ b/src/Extensions/StringExtensions.cs @@ -211,58 +211,6 @@ public static bool IsEqualIgnoringCase(this string value, string compareTo) return compareValue == 0; } - /// - /// Determines whether the string is a function signature. - /// - /// The string to check. - /// A value indicating whether the string is a function signature. - public static bool IsFunctionSignature(this string value) - { - return FunctionSignatureRegex().IsMatch(value); - } - - /// - /// Gets the variants of a function signature with optional parameters. - /// - /// The function signature segment. - /// An array of function signature variants with optional parameters. - public static string[] VariantsWithOptionalParameters(this string segment) - { - var variants = new List(); - - if (!segment.IsFunctionSignature()) - { - return []; - } - - var parameterListMatches = ParameterListRegex().Matches(segment); - - foreach (var parameterListMatch in parameterListMatches.ToList()) - { - var parameterList = parameterListMatch.Groups[1].Value; - - var parameterValuePairMatches = ParameterValuePairRegex().Matches(parameterList); - - var parameters = new List(); - - foreach (var parameterValuePairMatch in parameterValuePairMatches.ToList()) - { - var parameterName = parameterValuePairMatch.Groups.GetValueOrDefault("param")?.Value; - parameters.Add(parameterName ?? string.Empty); - } - - for (int i = 0; i < parameters.Count; i++) - { - var optionalParameters = parameters.Skip(i).ToArray(); - var optionalParameterString = string.Join(',', optionalParameters.Select(p => $"{p}='{{{p}}}'")); - var variant = segment.Replace(parameterList, optionalParameterString); - variants.Add(variant); - } - } - - return [.. variants]; - } - [GeneratedRegex("\\/{[^{}]*id[^{}]*}", RegexOptions.IgnoreCase)] private static partial Regex IdSegmentRegex(); @@ -295,10 +243,4 @@ public static string[] VariantsWithOptionalParameters(this string segment) [GeneratedRegex("^https://graph.microsoft.com/(?'version'[^/]+)/", RegexOptions.IgnoreCase | RegexOptions.Multiline)] private static partial Regex ApiVersionFromPathRegex(); - - [GeneratedRegex(@"\w+\([\w={},]+\)", RegexOptions.IgnoreCase)] - private static partial Regex FunctionSignatureRegex(); - - [GeneratedRegex(@"(?\w+)=\{(?[^}]+)\}", RegexOptions.IgnoreCase)] - private static partial Regex FunctionParameterRegex(); } From c39f13dd00f7cd66dcb6ca6428e07ad21c555425 Mon Sep 17 00:00:00 2001 From: Jason Johnston Date: Tue, 12 May 2026 11:14:51 -0400 Subject: [PATCH 4/4] Update Markdig --- src/CheckCloudSupport.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CheckCloudSupport.csproj b/src/CheckCloudSupport.csproj index df4ce8e..0b78737 100644 --- a/src/CheckCloudSupport.csproj +++ b/src/CheckCloudSupport.csproj @@ -14,7 +14,7 @@ - +