From c2b229cbb48d40aa05f15518c17e6e0b323f4f7c Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Wed, 3 Sep 2025 14:08:55 +0200 Subject: [PATCH 1/7] chore: nuget updates --- Directory.Build.props | 4 ++-- .../Atc.CodeGeneration.CSharp.csproj | 6 +++--- .../ApiOptionsHelper.cs | 6 +++--- .../Atc.Rest.ApiGenerator.CLI.csproj | 6 +++--- .../Atc.Rest.ApiGenerator.Client.CSharp.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.CodingRules.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.Contracts.csproj | 4 ++-- ...tc.Rest.ApiGenerator.Framework.Minimal.csproj | 2 +- .../Atc.Rest.ApiGenerator.Framework.Mvc.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.Framework.csproj | 8 ++++---- .../Providers/NugetPackageReferenceProvider.cs | 10 +++++----- .../Atc.Rest.ApiGenerator.Nuget.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.OpenApi.csproj | 10 +++++----- .../Atc.Rest.ApiGenerator.csproj | 16 ++++++++-------- .../Atc.CodeGeneration.CSharp.Tests.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.CLI.Tests.csproj | 14 +++++++------- .../Atc.Rest.ApiGenerator.Contracts.Tests.csproj | 4 ++-- ....Rest.ApiGenerator.Framework.Mvc.Tests.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.Framework.Tests.csproj | 6 +++--- .../Atc.Rest.ApiGenerator.Nuget.Tests.csproj | 6 +++--- .../Atc.Rest.ApiGenerator.OpenApi.Tests.csproj | 4 ++-- 21 files changed, 65 insertions(+), 65 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index bc2b6719..397c7ab6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,10 +43,10 @@ - + - + \ No newline at end of file diff --git a/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj b/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj index f6aa95c8..ef749592 100644 --- a/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj +++ b/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj @@ -6,9 +6,9 @@ - - - + + + diff --git a/src/Atc.Rest.ApiGenerator.CLI/ApiOptionsHelper.cs b/src/Atc.Rest.ApiGenerator.CLI/ApiOptionsHelper.cs index add9498f..f4193627 100644 --- a/src/Atc.Rest.ApiGenerator.CLI/ApiOptionsHelper.cs +++ b/src/Atc.Rest.ApiGenerator.CLI/ApiOptionsHelper.cs @@ -43,7 +43,7 @@ public static async Task CreateDefault( return new ApiOptions(); } - var options = await FileHelper.ReadJsonFileAndDeserializeAsync(fileInfo); + var options = await FileHelper.ReadJsonFileToModelAsync(fileInfo); return options ?? new ApiOptions(); } @@ -57,7 +57,7 @@ public static async Task CreateDefault( var fileInfo = GetOptionsFile(optionsPath); if (fileInfo.Exists) { - options = await FileHelper.ReadJsonFileAndDeserializeAsync(fileInfo) ?? new ApiOptions(); + options = await FileHelper.ReadJsonFileToModelAsync(fileInfo) ?? new ApiOptions(); } await FileHelper.WriteModelToJsonFileAsync(fileInfo, options); @@ -77,7 +77,7 @@ public static async Task CreateDefault( try { - var options = await FileHelper.ReadJsonFileAndDeserializeAsync(fileInfo); + var options = await FileHelper.ReadJsonFileToModelAsync(fileInfo); return options is null ? (false, "File is invalid") : (true, string.Empty); diff --git a/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj b/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj index b7721d64..a968372b 100644 --- a/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj +++ b/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/src/Atc.Rest.ApiGenerator.Client.CSharp/Atc.Rest.ApiGenerator.Client.CSharp.csproj b/src/Atc.Rest.ApiGenerator.Client.CSharp/Atc.Rest.ApiGenerator.Client.CSharp.csproj index d9e992bc..5d1f2b16 100644 --- a/src/Atc.Rest.ApiGenerator.Client.CSharp/Atc.Rest.ApiGenerator.Client.CSharp.csproj +++ b/src/Atc.Rest.ApiGenerator.Client.CSharp/Atc.Rest.ApiGenerator.Client.CSharp.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj b/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj index 876d3617..f5642b95 100644 --- a/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj +++ b/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj b/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj index 087c299a..f5d0d529 100644 --- a/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj +++ b/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj b/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj index 9a4d605f..7fea3882 100644 --- a/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj b/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj index 250fd9ff..dd8a0b03 100644 --- a/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj b/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj index 4330b8f8..f29556ca 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj @@ -26,10 +26,10 @@ - - - - + + + + diff --git a/src/Atc.Rest.ApiGenerator.Framework/Providers/NugetPackageReferenceProvider.cs b/src/Atc.Rest.ApiGenerator.Framework/Providers/NugetPackageReferenceProvider.cs index 0530c139..b3d22ebc 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Providers/NugetPackageReferenceProvider.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/Providers/NugetPackageReferenceProvider.cs @@ -8,14 +8,14 @@ public class NugetPackageReferenceProvider( private Dictionary PackageDefaultVersions { get; } = new(StringComparer.Ordinal) { { "Asp.Versioning.Http", "8.1.0" }, - { "Atc", "2.0.552" }, + { "Atc", "2.0.560" }, { "Atc.Azure.Options", "3.0.34" }, - { "Atc.Rest", "2.0.552" }, + { "Atc.Rest", "2.0.560" }, { "Atc.Rest.Client", "1.0.84" }, - { "Atc.Rest.Extended", "2.0.552" }, - { "Atc.Rest.FluentAssertions", "2.0.552" }, + { "Atc.Rest.Extended", "2.0.560" }, + { "Atc.Rest.FluentAssertions", "2.0.560" }, { "Atc.Rest.MinimalApi", "1.0.87" }, - { "Atc.XUnit", "2.0.552" }, + { "Atc.XUnit", "2.0.560" }, { "AutoFixture", "4.18.1" }, { "AutoFixture.AutoNSubstitute", "4.18.1" }, { "AutoFixture.Xunit2", "4.18.1" }, diff --git a/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj b/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj index 876d3617..f5642b95 100644 --- a/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj +++ b/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj b/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj index db7e74e0..e7f93087 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj @@ -6,11 +6,11 @@ - - - - - + + + + + diff --git a/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj b/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj index f3ffb12e..86f96f42 100644 --- a/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj +++ b/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj @@ -8,15 +8,15 @@ - - - - - + + + + + - - - + + + diff --git a/test/Atc.CodeGeneration.CSharp.Tests/Atc.CodeGeneration.CSharp.Tests.csproj b/test/Atc.CodeGeneration.CSharp.Tests/Atc.CodeGeneration.CSharp.Tests.csproj index dbe709dc..ca57a4a0 100644 --- a/test/Atc.CodeGeneration.CSharp.Tests/Atc.CodeGeneration.CSharp.Tests.csproj +++ b/test/Atc.CodeGeneration.CSharp.Tests/Atc.CodeGeneration.CSharp.Tests.csproj @@ -6,9 +6,9 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj b/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj index 594b1588..4d0745fd 100644 --- a/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj @@ -63,16 +63,16 @@ - - - - - - + + + + + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Atc.Rest.ApiGenerator.Contracts.Tests/Atc.Rest.ApiGenerator.Contracts.Tests.csproj b/test/Atc.Rest.ApiGenerator.Contracts.Tests/Atc.Rest.ApiGenerator.Contracts.Tests.csproj index e372a14a..2701895e 100644 --- a/test/Atc.Rest.ApiGenerator.Contracts.Tests/Atc.Rest.ApiGenerator.Contracts.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Contracts.Tests/Atc.Rest.ApiGenerator.Contracts.Tests.csproj @@ -6,9 +6,9 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Atc.Rest.ApiGenerator.Framework.Mvc.Tests/Atc.Rest.ApiGenerator.Framework.Mvc.Tests.csproj b/test/Atc.Rest.ApiGenerator.Framework.Mvc.Tests/Atc.Rest.ApiGenerator.Framework.Mvc.Tests.csproj index 15b4084e..3d4f4ceb 100644 --- a/test/Atc.Rest.ApiGenerator.Framework.Mvc.Tests/Atc.Rest.ApiGenerator.Framework.Mvc.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Framework.Mvc.Tests/Atc.Rest.ApiGenerator.Framework.Mvc.Tests.csproj @@ -7,9 +7,9 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj b/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj index 2218d623..b23121c4 100644 --- a/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj @@ -6,10 +6,10 @@ - - + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj b/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj index 7557e015..f62f8942 100644 --- a/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj @@ -6,10 +6,10 @@ - - + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Atc.Rest.ApiGenerator.OpenApi.Tests/Atc.Rest.ApiGenerator.OpenApi.Tests.csproj b/test/Atc.Rest.ApiGenerator.OpenApi.Tests/Atc.Rest.ApiGenerator.OpenApi.Tests.csproj index 0228a097..88cc9ca4 100644 --- a/test/Atc.Rest.ApiGenerator.OpenApi.Tests/Atc.Rest.ApiGenerator.OpenApi.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.OpenApi.Tests/Atc.Rest.ApiGenerator.OpenApi.Tests.csproj @@ -6,9 +6,9 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all From d4536221f98f1c2537e335e8373bc6523c1d9871 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 4 Sep 2025 09:31:28 +0200 Subject: [PATCH 2/7] feat: improve ContentGeneratorServerConfigureSwaggerDocOptions for description --- ...neratorServerConfigureSwaggerDocOptions.cs | 265 ++++++++++++------ .../ConfigureSwaggerDocOptions.verified.cs | 2 +- .../ConfigureSwaggerDocOptions.verified.cs | 2 +- 3 files changed, 179 insertions(+), 90 deletions(-) diff --git a/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs b/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs index 141d8d52..a89ffc74 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs @@ -21,7 +21,7 @@ public string Generate() var sb = new StringBuilder(); sb.Append(codeHeaderGenerator.Generate()); - sb.AppendLine($"namespace {parameters.Namespace}.Options;"); // TODO: Move to constant + sb.AppendLine($"namespace {parameters.Namespace}.Options;"); sb.AppendLine(); sb.AppendLine(codeAttributeGenerator.Generate()); sb.AppendLine("public class ConfigureSwaggerDocOptions : IConfigureOptions"); @@ -58,114 +58,203 @@ public string Generate() sb.AppendLine(8, "ApiVersionDescription description)"); sb.AppendLine(4, "{"); - var description = string.Empty; - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.Description)) + var opts = parameters.SwaggerDocOptions; + var descriptionText = string.Empty; + if (!string.IsNullOrWhiteSpace(opts.Description)) { - description = parameters.SwaggerDocOptions.Description! + descriptionText = opts.Description! .Replace("\"", string.Empty, StringComparison.Ordinal) .Replace("'", string.Empty, StringComparison.Ordinal) .Trim(); } - sb.AppendLine(8, $"var text = new StringBuilder(@\"{description}\");"); - sb.AppendLine(8, "var info = new OpenApiInfo"); - sb.AppendLine(8, "{"); - sb.AppendLine(12, "Title = $\"{environment.ApplicationName} {description.GroupName.ToUpperInvariant()}\","); - sb.AppendLine(12, "Version = description.ApiVersion.ToString(),"); - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactName) || - !string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactEmail) || - !string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactUrl)) - { - sb.AppendLine(12, "Contact = new OpenApiContact"); - sb.AppendLine(12, "{"); - - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactName)) - { - sb.AppendLine(16, $"Name = \"{parameters.SwaggerDocOptions.ContactName}\","); - } + AppendStringBuilderInit(sb, 8, descriptionText); + AppendApiInfo(sb, 8, opts); + AppendSunsetPolicyBlock(sb, 8); - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactEmail)) - { - sb.AppendLine(16, $"Email = \"{parameters.SwaggerDocOptions.ContactEmail}\","); - } - - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.ContactUrl)) - { - sb.AppendLine(16, $"Url = new Uri(\"{parameters.SwaggerDocOptions.ContactUrl}\"),"); - } + sb.AppendLine(8, "info.Description = text.ToString();"); + sb.AppendLine(); + sb.AppendLine(8, "return info;"); + sb.AppendLine(4, "}"); + sb.Append('}'); - sb.AppendLine(12, "},"); - } + return sb.ToString(); + } - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.TermsOfService)) - { - sb.AppendLine(12, $"TermsOfService = new Uri(\"{parameters.SwaggerDocOptions.TermsOfService}\"),"); - } + private static void AppendApiInfo( + StringBuilder sb, + int baseIndent, + SwaggerDocOptionsParameters opts) + { + var indent = baseIndent + 4; - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.LicenseName) || - !string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.LicenseUrl)) - { - sb.AppendLine(12, "License = new OpenApiLicense"); - sb.AppendLine(12, "{"); + sb.AppendLine(baseIndent, "var info = new OpenApiInfo"); + sb.AppendLine(baseIndent, "{"); + sb.AppendLine(indent, "Title = $\"{environment.ApplicationName} {description.GroupName.ToUpperInvariant()}\","); + sb.AppendLine(indent, "Version = description.ApiVersion.ToString(),"); - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.LicenseName)) - { - sb.AppendLine(16, $"Name = \"{parameters.SwaggerDocOptions.LicenseName}\","); - } + AppendContact(sb, indent, opts.ContactName, opts.ContactEmail, opts.ContactUrl); + AppendTermsOfService(sb, indent, opts.TermsOfService); + AppendLicense(sb, indent, opts.LicenseName, opts.LicenseUrl); - if (!string.IsNullOrWhiteSpace(parameters.SwaggerDocOptions.LicenseUrl)) - { - sb.AppendLine(16, $"Url = new Uri(\"{parameters.SwaggerDocOptions.LicenseUrl}\"),"); - } + sb.AppendLine(baseIndent, "};"); + sb.AppendLine(); + } - sb.AppendLine(12, "},"); - } + private static void AppendSunsetPolicyBlock( + StringBuilder sb, + int baseIndent) + { + var i1 = baseIndent + 4; + var i2 = i1 + 4; + var i3 = i2 + 4; + var i4 = i3 + 4; - sb.AppendLine(8, "};"); + sb.AppendLine(baseIndent, "if (description.IsDeprecated)"); + sb.AppendLine(baseIndent, "{"); + sb.AppendLine(i1, "text.Append(\" This API version has been deprecated.\");"); + sb.AppendLine(baseIndent, "}"); sb.AppendLine(); - sb.AppendLine(8, "if (description.IsDeprecated)"); - sb.AppendLine(8, "{"); - sb.AppendLine(12, "text.Append(\" This API version has been deprecated.\");"); - sb.AppendLine(8, "}"); - sb.AppendLine(); - sb.AppendLine(8, "if (description.SunsetPolicy is { } policy)"); - sb.AppendLine(8, "{"); - sb.AppendLine(12, "if (policy.Date is { } when)"); - sb.AppendLine(12, "{"); - sb.AppendLine(16, "text.Append(\" The API will be sunset on \")"); - sb.AppendLine(20, ".Append(when.Date.ToShortDateString())"); - sb.AppendLine(20, ".Append('.');"); - sb.AppendLine(12, "}"); + sb.AppendLine(baseIndent, "if (description.SunsetPolicy is { } policy)"); + sb.AppendLine(baseIndent, "{"); + sb.AppendLine(i1, "if (policy.Date is { } when)"); + sb.AppendLine(i1, "{"); + sb.AppendLine(i2, "text.Append(\" The API will be sunset on \")"); + sb.AppendLine(i3, ".Append(when.Date.ToShortDateString())"); + sb.AppendLine(i3, ".Append('.');"); + sb.AppendLine(i1, "}"); sb.AppendLine(); - sb.AppendLine(12, "if (policy.HasLinks)"); - sb.AppendLine(12, "{"); - sb.AppendLine(16, "text.AppendLine();"); + sb.AppendLine(i1, "if (policy.HasLinks)"); + sb.AppendLine(i1, "{"); + sb.AppendLine(i2, "text.AppendLine();"); sb.AppendLine(); - sb.AppendLine(16, "foreach (var link in policy.Links)"); - sb.AppendLine(16, "{"); - sb.AppendLine(20, "if (link.Type != \"text/html\")"); - sb.AppendLine(20, "{"); - sb.AppendLine(24, "continue;"); - sb.AppendLine(20, "}"); + sb.AppendLine(i2, "foreach (var link in policy.Links)"); + sb.AppendLine(i2, "{"); + sb.AppendLine(i3, "if (link.Type != \"text/html\")"); + sb.AppendLine(i3, "{"); + sb.AppendLine(i4, "continue;"); + sb.AppendLine(i3, "}"); sb.AppendLine(); - sb.AppendLine(20, "text.AppendLine();"); + sb.AppendLine(i3, "text.AppendLine();"); sb.AppendLine(); - sb.AppendLine(20, "if (link.Title.HasValue)"); - sb.AppendLine(20, "{"); - sb.AppendLine(24, "text.Append(link.Title.Value).Append(\": \");"); - sb.AppendLine(20, "}"); + sb.AppendLine(i3, "if (link.Title.HasValue)"); + sb.AppendLine(i3, "{"); + sb.AppendLine(i4, "text.Append(link.Title.Value).Append(\": \");"); + sb.AppendLine(i3, "}"); sb.AppendLine(); - sb.AppendLine(20, "text.Append(link.LinkTarget.OriginalString);"); - sb.AppendLine(16, "}"); - sb.AppendLine(12, "}"); - sb.AppendLine(8, "}"); + sb.AppendLine(i3, "text.Append(link.LinkTarget.OriginalString);"); + sb.AppendLine(i2, "}"); + sb.AppendLine(i1, "}"); + sb.AppendLine(baseIndent, "}"); sb.AppendLine(); - sb.AppendLine(8, "info.Description = text.ToString();"); + } + + private static void AppendStringBuilderInit( + StringBuilder sb, + int baseIndent, + string? text) + { + sb.Append(baseIndent, "var text = new StringBuilder("); + if (!string.IsNullOrEmpty(text)) + { + sb.Append(BuildStringLiteral(text)); + } + sb.Append(");"); sb.AppendLine(); - sb.AppendLine(8, "return info;"); - sb.AppendLine(4, "}"); - sb.Append('}'); + } - return sb.ToString(); + private static void AppendContact( + StringBuilder sb, + int baseIndent, + string? name, + string? email, + string? url) + { + if (!Has(name) && + !Has(email) && + !Has(url)) + { + return; + } + + var innerIndent = baseIndent + 4; + + sb.AppendLine(baseIndent, "Contact = new OpenApiContact"); + sb.AppendLine(baseIndent, "{"); + if (Has(name)) + { + sb.AppendLine(innerIndent, $"Name = {BuildStringLiteral(name!)},"); + } + + if (Has(email)) + { + sb.AppendLine(innerIndent, $"Email = {BuildStringLiteral(email!)},"); + } + + if (Has(url)) + { + sb.AppendLine(innerIndent, $"Url = new Uri({BuildStringLiteral(url!)}),"); + } + + sb.AppendLine(baseIndent, "},"); } -} \ No newline at end of file + + private static void AppendTermsOfService( + StringBuilder sb, + int indentBase, + string? termsUrl) + { + if (Has(termsUrl)) + { + sb.AppendLine(indentBase, $"TermsOfService = new Uri({BuildStringLiteral(termsUrl!)}),"); + } + } + + private static void AppendLicense( + StringBuilder sb, + int indentBase, + string? licenseName, + string? licenseUrl) + { + if (!Has(licenseName) && + !Has(licenseUrl)) + { + return; + } + + var innerIndent = indentBase + 4; + + sb.AppendLine(indentBase, "License = new OpenApiLicense"); + sb.AppendLine(indentBase, "{"); + if (Has(licenseName)) + { + sb.AppendLine(innerIndent, $"Name = {BuildStringLiteral(licenseName!)},"); + } + + if (Has(licenseUrl)) + { + sb.AppendLine(innerIndent, $"Url = new Uri({BuildStringLiteral(licenseUrl!)}),"); + } + + sb.AppendLine(indentBase, "},"); + } + + private static string BuildStringLiteral( + string text) + { + // Use verbatim if backslashes or newlines are present. + if (text.IndexOfAny(new[] { '\\', '\r', '\n' }) >= 0) + { + var verbatim = text.Replace("\"", "\"\""); + return "@\"" + verbatim + "\""; + } + + // Otherwise, use a normal C# string literal. + var normal = text.Replace("\\", "\\\\").Replace("\"", "\\\""); + return "\"" + normal + "\""; + } + + private static bool Has( + string? s) + => !string.IsNullOrWhiteSpace(s); +} diff --git a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WOPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WOPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs index 6bc72eaf..3a2f2bf2 100644 --- a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WOPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs +++ b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WOPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs @@ -39,7 +39,7 @@ public void Configure( private OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription description) { - var text = new StringBuilder(""); + var text = new StringBuilder(); var info = new OpenApiInfo { Title = $"{environment.ApplicationName} {description.GroupName.ToUpperInvariant()}", diff --git a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs index 6bc72eaf..3a2f2bf2 100644 --- a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs +++ b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/PetStore/VerifyServerAll/Mvc_WPD/src/PetStore.Api/Options/ConfigureSwaggerDocOptions.verified.cs @@ -39,7 +39,7 @@ public void Configure( private OpenApiInfo CreateInfoForApiVersion( ApiVersionDescription description) { - var text = new StringBuilder(""); + var text = new StringBuilder(); var info = new OpenApiInfo { Title = $"{environment.ApplicationName} {description.GroupName.ToUpperInvariant()}", From f8ea65e97e249158d1766a9f11a301ae82f88b42 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 4 Sep 2025 10:02:16 +0200 Subject: [PATCH 3/7] chore: fix some null checks, use OpenApiDataTypeConstants.Object instead of string-version --- ...tGeneratorClientParameterParametersFactory.cs | 2 +- ...GeneratorServerClientEnumParametersFactory.cs | 2 +- ...eneratorServerClientModelParametersFactory.cs | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/Client/ContentGeneratorClientParameterParametersFactory.cs b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/Client/ContentGeneratorClientParameterParametersFactory.cs index 9110f438..89f2fc97 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/Client/ContentGeneratorClientParameterParametersFactory.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/Client/ContentGeneratorClientParameterParametersFactory.cs @@ -109,7 +109,7 @@ private static void AppendParametersFromBody( { requestBodyType = "IFormFile"; } - else if (requestSchema.Items is not null) + else if (requestSchema.Items?.Reference is not null) { requestBodyType = requestSchema.Items.Reference.Id.PascalCase(ApiOperationExtractor.ModelNameSeparators, removeSeparators: true); } diff --git a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientEnumParametersFactory.cs b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientEnumParametersFactory.cs index f9b72e74..4bade77e 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientEnumParametersFactory.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientEnumParametersFactory.cs @@ -43,7 +43,7 @@ public static EnumParameters Create( { case 1: result.Add( - key: sa[0].Trim(), + key: sa[0].Trim().Replace(":", "-", StringComparison.CurrentCulture), value: null); break; case 2: diff --git a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientModelParametersFactory.cs b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientModelParametersFactory.cs index 715d33c1..02e29e6f 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientModelParametersFactory.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/Factories/Parameters/ServerClient/ContentGeneratorServerClientModelParametersFactory.cs @@ -179,7 +179,13 @@ private static bool GetRequired( : $"{schema.GetModelName()}.{value.EnsureFirstCharacterToUpper()}"; } - return schema.Default.GetDefaultValueAsString(); + if (schema.Type is not null && + schema.Type != "object") + { + return schema.Default.GetDefaultValueAsString(); + } + + return null; } if (NameConstants.List.Equals(dataTypeForList, StringComparison.Ordinal)) @@ -252,7 +258,7 @@ private static List ExtractPropertiesParameters( if ("Object".Equals(dataType, StringComparison.Ordinal)) { - dataType = "object"; + dataType = OpenApiDataTypeConstants.Object; } } else @@ -269,7 +275,7 @@ private static List ExtractPropertiesParameters( } else { - dataType = "object"; + dataType = OpenApiDataTypeConstants.Object; } } } @@ -450,7 +456,7 @@ private static List ExtractRecordParameterBaseParameter if ("Object".Equals(dataType, StringComparison.Ordinal)) { - dataType = "object"; + dataType = OpenApiDataTypeConstants.Object; } } else @@ -467,7 +473,7 @@ private static List ExtractRecordParameterBaseParameter } else { - dataType = "object"; + dataType = OpenApiDataTypeConstants.Object; } } } From 5eb907a13b07ad788bbd546c560468e28c7a98af Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 4 Sep 2025 10:02:50 +0200 Subject: [PATCH 4/7] feat: improve OpenApiAnyExtensions to handle more types --- .../Extensions/OpenApiAnyExtensions.cs | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs index 9422855d..a14d5f9a 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs @@ -2,6 +2,17 @@ namespace Atc.Rest.ApiGenerator.OpenApi.Extensions; public static class OpenApiAnyExtensions { + /// + /// Returns a string representation of common OpenAPI primitives with predictable, culture-fixed formatting. + /// Notes: + /// - Booleans -> "true"/"false" (lowercase JSON style). + /// - Date -> "yyyy-MM-dd" (e.g., 2025-09-03), culture-fixed to avoid month/day swaps. + /// - DateTime -> ISO 8601 round-trip "O" (e.g., 2025-09-03T12:34:56.7890123+00:00). + /// - Double/Float -> "N" using en-US (group separators + decimals; e.g., 1,234.00). + /// - Long/Integer -> default numeric ("G") with en-US (no group separators, no decimals; e.g., 1234). + /// - Null -> "null" literal. + /// - String/Password -> empty -> "string.Empty"; otherwise the raw value (unquoted). + /// public static string? GetDefaultValueAsString( this IOpenApiAny? openApiAny) { @@ -12,12 +23,17 @@ public static class OpenApiAnyExtensions return openApiAny switch { - OpenApiDouble apiDouble => apiDouble.Value.ToString("N"), - OpenApiFloat apiFloat => apiFloat.Value.ToString("N"), - OpenApiInteger apiInteger => apiInteger.Value.ToString(), - OpenApiString apiString => string.IsNullOrEmpty(apiString.Value) ? "string.Empty" : $"{apiString.Value}", OpenApiBoolean { Value: true } => "true", OpenApiBoolean { Value: false } => "false", + OpenApiDate apiDate => apiDate.Value.ToString("yyyy-MM-dd", GlobalizationConstants.EnglishCultureInfo), + OpenApiDateTime apiDateTime => apiDateTime.Value.ToString("O", GlobalizationConstants.EnglishCultureInfo), + OpenApiDouble apiDouble => apiDouble.Value.ToString("N", GlobalizationConstants.EnglishCultureInfo), + OpenApiFloat apiFloat => apiFloat.Value.ToString("N", GlobalizationConstants.EnglishCultureInfo), + OpenApiLong apiLong => apiLong.Value.ToString(GlobalizationConstants.EnglishCultureInfo), + OpenApiInteger apiInteger => apiInteger.Value.ToString(GlobalizationConstants.EnglishCultureInfo), + OpenApiNull => "null", + OpenApiPassword apiPassword => string.IsNullOrEmpty(apiPassword.Value) ? "string.Empty" : $"{apiPassword.Value}", + OpenApiString apiString => string.IsNullOrEmpty(apiString.Value) ? "string.Empty" : $"{apiString.Value}", _ => throw new NotImplementedException("Property initializer: " + openApiAny.GetType()), }; } From ebee5eb82afa21e11515f8ffdb7da7e374bfe817 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Thu, 4 Sep 2025 11:50:53 +0200 Subject: [PATCH 5/7] chore: nuget updates --- Directory.Build.props | 2 +- .../Atc.CodeGeneration.CSharp.csproj | 8 ++------ .../Atc.Rest.ApiGenerator.CLI.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.CodingRules.csproj | 2 +- .../Atc.Rest.ApiGenerator.Contracts.csproj | 8 ++------ .../Atc.Rest.ApiGenerator.Framework.Minimal.csproj | 2 +- .../Atc.Rest.ApiGenerator.Framework.Mvc.csproj | 4 ++-- .../Atc.Rest.ApiGenerator.Framework.csproj | 6 +++--- .../Atc.Rest.ApiGenerator.Nuget.csproj | 2 +- .../Atc.Rest.ApiGenerator.OpenApi.csproj | 10 +++------- src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj | 10 +++++----- .../Atc.Rest.ApiGenerator.CLI.Tests.csproj | 6 +++--- .../Atc.Rest.ApiGenerator.Framework.Tests.csproj | 2 +- .../Atc.Rest.ApiGenerator.Nuget.Tests.csproj | 2 +- 14 files changed, 28 insertions(+), 40 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 397c7ab6..d40337d1 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,7 +43,7 @@ - + diff --git a/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj b/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj index ef749592..ba67ba52 100644 --- a/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj +++ b/src/Atc.CodeGeneration.CSharp/Atc.CodeGeneration.CSharp.csproj @@ -6,13 +6,9 @@ - - + + - - - - \ No newline at end of file diff --git a/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj b/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj index a968372b..b703ea2e 100644 --- a/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj +++ b/src/Atc.Rest.ApiGenerator.CLI/Atc.Rest.ApiGenerator.CLI.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj b/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj index f5642b95..0b1a6916 100644 --- a/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj +++ b/src/Atc.Rest.ApiGenerator.CodingRules/Atc.Rest.ApiGenerator.CodingRules.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj b/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj index f5d0d529..d2d5ddf8 100644 --- a/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj +++ b/src/Atc.Rest.ApiGenerator.Contracts/Atc.Rest.ApiGenerator.Contracts.csproj @@ -6,16 +6,12 @@ - - + + - - - - diff --git a/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj b/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj index 7fea3882..9a72b2b7 100644 --- a/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework.Minimal/Atc.Rest.ApiGenerator.Framework.Minimal.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj b/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj index dd8a0b03..758107b4 100644 --- a/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework.Mvc/Atc.Rest.ApiGenerator.Framework.Mvc.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj b/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj index f29556ca..317dddef 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj +++ b/src/Atc.Rest.ApiGenerator.Framework/Atc.Rest.ApiGenerator.Framework.csproj @@ -26,9 +26,9 @@ - - - + + + diff --git a/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj b/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj index f5642b95..0b1a6916 100644 --- a/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj +++ b/src/Atc.Rest.ApiGenerator.Nuget/Atc.Rest.ApiGenerator.Nuget.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj b/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj index e7f93087..87d99c44 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Atc.Rest.ApiGenerator.OpenApi.csproj @@ -6,9 +6,9 @@ - - - + + + @@ -17,8 +17,4 @@ - - - - diff --git a/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj b/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj index 86f96f42..7abfcef9 100644 --- a/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj +++ b/src/Atc.Rest.ApiGenerator/Atc.Rest.ApiGenerator.csproj @@ -8,11 +8,11 @@ - - - - - + + + + + diff --git a/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj b/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj index 4d0745fd..b9b360ed 100644 --- a/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.CLI.Tests/Atc.Rest.ApiGenerator.CLI.Tests.csproj @@ -63,11 +63,11 @@ - + - - + + diff --git a/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj b/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj index b23121c4..42c30998 100644 --- a/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Framework.Tests/Atc.Rest.ApiGenerator.Framework.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj b/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj index f62f8942..3a3539b7 100644 --- a/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj +++ b/test/Atc.Rest.ApiGenerator.Nuget.Tests/Atc.Rest.ApiGenerator.Nuget.Tests.csproj @@ -6,7 +6,7 @@ - + From 3ed810aa203917c2837489a1bd32172cfa315705 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Fri, 5 Sep 2025 09:38:20 +0200 Subject: [PATCH 6/7] chore: fix some SA-rules --- ...neratorServerConfigureSwaggerDocOptions.cs | 8 ++-- .../Extensions/OpenApiAnyExtensions.cs | 42 +++++++++++++++---- .../Extensions/OpenApiParameterExtensions.cs | 4 +- .../Extractors/ApiOperationExtractor.cs | 4 +- .../Contracts/_Shared/Pricing.verified.cs | 2 +- 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs b/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs index a89ffc74..7930b522 100644 --- a/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs +++ b/src/Atc.Rest.ApiGenerator.Framework/ContentGenerators/Server/ContentGeneratorServerConfigureSwaggerDocOptions.cs @@ -245,16 +245,18 @@ private static string BuildStringLiteral( // Use verbatim if backslashes or newlines are present. if (text.IndexOfAny(new[] { '\\', '\r', '\n' }) >= 0) { - var verbatim = text.Replace("\"", "\"\""); + var verbatim = text.Replace("\"", "\"\"", StringComparison.Ordinal); return "@\"" + verbatim + "\""; } // Otherwise, use a normal C# string literal. - var normal = text.Replace("\\", "\\\\").Replace("\"", "\\\""); + var normal = text + .Replace("\\", "\\\\", StringComparison.Ordinal) + .Replace("\"", "\\\"", StringComparison.Ordinal); return "\"" + normal + "\""; } private static bool Has( string? s) => !string.IsNullOrWhiteSpace(s); -} +} \ No newline at end of file diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs index a14d5f9a..63a2101e 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiAnyExtensions.cs @@ -4,15 +4,41 @@ public static class OpenApiAnyExtensions { /// /// Returns a string representation of common OpenAPI primitives with predictable, culture-fixed formatting. - /// Notes: - /// - Booleans -> "true"/"false" (lowercase JSON style). - /// - Date -> "yyyy-MM-dd" (e.g., 2025-09-03), culture-fixed to avoid month/day swaps. - /// - DateTime -> ISO 8601 round-trip "O" (e.g., 2025-09-03T12:34:56.7890123+00:00). - /// - Double/Float -> "N" using en-US (group separators + decimals; e.g., 1,234.00). - /// - Long/Integer -> default numeric ("G") with en-US (no group separators, no decimals; e.g., 1234). - /// - Null -> "null" literal. - /// - String/Password -> empty -> "string.Empty"; otherwise the raw value (unquoted). /// + /// + /// Formatting rules: + /// + /// Booleans"true"/"false" (lowercase JSON style). + /// Date"yyyy-MM-dd" (e.g., 2025-09-03), culture-fixed to avoid month/day swaps. + /// DateTime → ISO 8601 round-trip "O" (e.g., 2025-09-03T12:34:56.7890123+00:00). + /// Double/Float → standard numeric format "N" using en-US (group separators + decimals; e.g., 1,234.00). + /// Long/Integer → general numeric format "G" using en-US (no group separators, no decimals; e.g., 1234). + /// Null → the literal "null". + /// String/Password → empty → "string.Empty"; otherwise the raw value (unquoted). + /// + /// + /// Culture is fixed to (en-US) to ensure consistent output across environments. + /// + /// + /// The value to format (e.g., , , , , , , , , , ). + /// + /// The formatted string representation of ; if is . + /// + /// + /// Thrown when is an subtype not handled by this method. + /// + /// + /// + /// IOpenApiAny v1 = new OpenApiDouble(1234); + /// string? s1 = v1.GetDefaultValueAsString(); // "1,234.00" + /// + /// IOpenApiAny v2 = new OpenApiDate(new DateOnly(2025, 9, 3)); + /// string? s2 = v2.GetDefaultValueAsString(); // "2025-09-03" + /// + /// IOpenApiAny v3 = new OpenApiString(string.Empty); + /// string? s3 = v3.GetDefaultValueAsString(); // "string.Empty" + /// + /// public static string? GetDefaultValueAsString( this IOpenApiAny? openApiAny) { diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiParameterExtensions.cs b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiParameterExtensions.cs index 1beac4a9..b14090f6 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiParameterExtensions.cs +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiParameterExtensions.cs @@ -47,7 +47,9 @@ public static bool ContainsEnumInSchemaOrProperties( var defaultValueInitializer = openApiParameter.Schema.GetDefaultValueAsString(); if (!string.IsNullOrEmpty(defaultValueInitializer) && - openApiParameter.ContainsEnumInSchemaOrProperties()) + openApiParameter.ContainsEnumInSchemaOrProperties() && + dataType != "long" && + dataType != "string") { defaultValueInitializer = dataType.Equals(parameterName, StringComparison.Ordinal) ? $"{contractNamespaceWithoutApiGroupName}.{dataType}.{defaultValueInitializer.PascalCase(ApiOperationExtractor.ModelNameSeparators, removeSeparators: true)}" diff --git a/src/Atc.Rest.ApiGenerator.OpenApi/Extractors/ApiOperationExtractor.cs b/src/Atc.Rest.ApiGenerator.OpenApi/Extractors/ApiOperationExtractor.cs index 438f5518..9cf41e4b 100644 --- a/src/Atc.Rest.ApiGenerator.OpenApi/Extractors/ApiOperationExtractor.cs +++ b/src/Atc.Rest.ApiGenerator.OpenApi/Extractors/ApiOperationExtractor.cs @@ -168,9 +168,9 @@ private static void CollectSchema( httpOperation, parentApiSchema, result); - } - return; + return; + } } (var schemaKey, apiSchema) = ConsolidateSchemaObjectTypes(apiSchema); diff --git a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/Monta/VerifyClient/WCEM/src/Monta.ApiClient.Generated/Contracts/_Shared/Pricing.verified.cs b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/Monta/VerifyClient/WCEM/src/Monta.ApiClient.Generated/Contracts/_Shared/Pricing.verified.cs index f83b1bc5..9b2e1a76 100644 --- a/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/Monta/VerifyClient/WCEM/src/Monta.ApiClient.Generated/Contracts/_Shared/Pricing.verified.cs +++ b/test/Atc.Rest.ApiGenerator.CLI.Tests/Scenarios/Monta/VerifyClient/WCEM/src/Monta.ApiClient.Generated/Contracts/_Shared/Pricing.verified.cs @@ -57,7 +57,7 @@ public class Pricing /// /// Used by Spot Price. It will multiply the fallback price by this percentage. /// - public double? Percentage { get; set; } + public float? Percentage { get; set; } /// /// The id of the selected Tariff. From 8b5fe7b821f90217d073f65eb941096cc155daea Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Fri, 5 Sep 2025 09:45:36 +0200 Subject: [PATCH 7/7] build: migrate project sln to slnx --- .github/workflows/pre-integration.yml | 2 +- Atc.Rest.Api.Generator.sln | 156 -------------------------- Atc.Rest.Api.Generator.slnx | 27 +++++ 3 files changed, 28 insertions(+), 157 deletions(-) delete mode 100644 Atc.Rest.Api.Generator.sln create mode 100644 Atc.Rest.Api.Generator.slnx diff --git a/.github/workflows/pre-integration.yml b/.github/workflows/pre-integration.yml index 5b2ba46d..faeab5f6 100644 --- a/.github/workflows/pre-integration.yml +++ b/.github/workflows/pre-integration.yml @@ -88,7 +88,7 @@ jobs: run: dotnet restore - name: 🛠️ Build with dotnet - run: dotnet build Atc.Rest.Api.Generator.sln + run: dotnet build Atc.Rest.Api.Generator.slnx - name: ⬇️🌎 Download Swagger Petstore v3 spec run: curl -O https://petstore3.swagger.io/api/v3/openapi.yaml diff --git a/Atc.Rest.Api.Generator.sln b/Atc.Rest.Api.Generator.sln deleted file mode 100644 index 1ce1b35d..00000000 --- a/Atc.Rest.Api.Generator.sln +++ /dev/null @@ -1,156 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F39DCB66-0A9F-47BA-A916-301EC83F26EA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{A4F3156B-9E74-4710-ADBC-4628DF389F68}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator", "src\Atc.Rest.ApiGenerator\Atc.Rest.ApiGenerator.csproj", "{91EBC1B7-0F17-4E4E-96AF-A9D5445344AB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{1575FE97-3F0C-4E58-963E-30B06A03133F}" - ProjectSection(SolutionItems) = preProject - README.md = README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.CLI", "src\Atc.Rest.ApiGenerator.CLI\Atc.Rest.ApiGenerator.CLI.csproj", "{0F69048E-9C05-4BE1-9C73-F703B8ACC8C4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Framework.Mvc", "src\Atc.Rest.ApiGenerator.Framework.Mvc\Atc.Rest.ApiGenerator.Framework.Mvc.csproj", "{5416CB30-1728-43C9-A7DE-D3463E35866D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Framework.Minimal", "src\Atc.Rest.ApiGenerator.Framework.Minimal\Atc.Rest.ApiGenerator.Framework.Minimal.csproj", "{E0B64023-B487-4B0E-9A2B-B9E28D1E7964}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Framework", "src\Atc.Rest.ApiGenerator.Framework\Atc.Rest.ApiGenerator.Framework.csproj", "{2D69D9AA-19E2-469D-BCA4-ED972721E005}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Framework.Mvc.Tests", "test\Atc.Rest.ApiGenerator.Framework.Mvc.Tests\Atc.Rest.ApiGenerator.Framework.Mvc.Tests.csproj", "{108216D7-4552-4397-AC5A-5C3346D65BFB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Contracts", "src\Atc.Rest.ApiGenerator.Contracts\Atc.Rest.ApiGenerator.Contracts.csproj", "{DEA4D5EC-DD8A-48D6-B859-55D95F46CC06}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.OpenApi", "src\Atc.Rest.ApiGenerator.OpenApi\Atc.Rest.ApiGenerator.OpenApi.csproj", "{EE12FAB6-FEA2-4819-ABAF-B38319325F35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.OpenApi.Tests", "test\Atc.Rest.ApiGenerator.OpenApi.Tests\Atc.Rest.ApiGenerator.OpenApi.Tests.csproj", "{4562D01B-E184-489C-904B-C9E39BA17E6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Framework.Tests", "test\Atc.Rest.ApiGenerator.Framework.Tests\Atc.Rest.ApiGenerator.Framework.Tests.csproj", "{B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.CodeGeneration.CSharp", "src\Atc.CodeGeneration.CSharp\Atc.CodeGeneration.CSharp.csproj", "{9A87BAA2-F521-45B1-AF93-9BC642FD8C76}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.CodeGeneration.CSharp.Tests", "test\Atc.CodeGeneration.CSharp.Tests\Atc.CodeGeneration.CSharp.Tests.csproj", "{F8F86538-AFA4-4CD9-9DF7-C870F85F4608}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Nuget", "src\Atc.Rest.ApiGenerator.Nuget\Atc.Rest.ApiGenerator.Nuget.csproj", "{8670E175-EB04-4FDC-9D04-8FB0839CCF49}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.CodingRules", "src\Atc.Rest.ApiGenerator.CodingRules\Atc.Rest.ApiGenerator.CodingRules.csproj", "{6DE044E7-2804-48AD-8EF1-EC804A2C0395}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Nuget.Tests", "test\Atc.Rest.ApiGenerator.Nuget.Tests\Atc.Rest.ApiGenerator.Nuget.Tests.csproj", "{3F33D1B3-7AD9-44A3-B5F4-048BED3913C8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Contracts.Tests", "test\Atc.Rest.ApiGenerator.Contracts.Tests\Atc.Rest.ApiGenerator.Contracts.Tests.csproj", "{8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.CLI.Tests", "test\Atc.Rest.ApiGenerator.CLI.Tests\Atc.Rest.ApiGenerator.CLI.Tests.csproj", "{D75819AA-3092-43F6-80D2-1BF2FCAA92EE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Atc.Rest.ApiGenerator.Client.CSharp", "src\Atc.Rest.ApiGenerator.Client.CSharp\Atc.Rest.ApiGenerator.Client.CSharp.csproj", "{6BACA326-54B0-4832-B16E-1419083EECFD}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {91EBC1B7-0F17-4E4E-96AF-A9D5445344AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91EBC1B7-0F17-4E4E-96AF-A9D5445344AB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91EBC1B7-0F17-4E4E-96AF-A9D5445344AB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91EBC1B7-0F17-4E4E-96AF-A9D5445344AB}.Release|Any CPU.Build.0 = Release|Any CPU - {0F69048E-9C05-4BE1-9C73-F703B8ACC8C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F69048E-9C05-4BE1-9C73-F703B8ACC8C4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F69048E-9C05-4BE1-9C73-F703B8ACC8C4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F69048E-9C05-4BE1-9C73-F703B8ACC8C4}.Release|Any CPU.Build.0 = Release|Any CPU - {5416CB30-1728-43C9-A7DE-D3463E35866D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5416CB30-1728-43C9-A7DE-D3463E35866D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5416CB30-1728-43C9-A7DE-D3463E35866D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5416CB30-1728-43C9-A7DE-D3463E35866D}.Release|Any CPU.Build.0 = Release|Any CPU - {E0B64023-B487-4B0E-9A2B-B9E28D1E7964}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0B64023-B487-4B0E-9A2B-B9E28D1E7964}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0B64023-B487-4B0E-9A2B-B9E28D1E7964}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0B64023-B487-4B0E-9A2B-B9E28D1E7964}.Release|Any CPU.Build.0 = Release|Any CPU - {2D69D9AA-19E2-469D-BCA4-ED972721E005}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D69D9AA-19E2-469D-BCA4-ED972721E005}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D69D9AA-19E2-469D-BCA4-ED972721E005}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D69D9AA-19E2-469D-BCA4-ED972721E005}.Release|Any CPU.Build.0 = Release|Any CPU - {108216D7-4552-4397-AC5A-5C3346D65BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {108216D7-4552-4397-AC5A-5C3346D65BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {108216D7-4552-4397-AC5A-5C3346D65BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {108216D7-4552-4397-AC5A-5C3346D65BFB}.Release|Any CPU.Build.0 = Release|Any CPU - {DEA4D5EC-DD8A-48D6-B859-55D95F46CC06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEA4D5EC-DD8A-48D6-B859-55D95F46CC06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEA4D5EC-DD8A-48D6-B859-55D95F46CC06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEA4D5EC-DD8A-48D6-B859-55D95F46CC06}.Release|Any CPU.Build.0 = Release|Any CPU - {EE12FAB6-FEA2-4819-ABAF-B38319325F35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE12FAB6-FEA2-4819-ABAF-B38319325F35}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE12FAB6-FEA2-4819-ABAF-B38319325F35}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE12FAB6-FEA2-4819-ABAF-B38319325F35}.Release|Any CPU.Build.0 = Release|Any CPU - {4562D01B-E184-489C-904B-C9E39BA17E6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4562D01B-E184-489C-904B-C9E39BA17E6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4562D01B-E184-489C-904B-C9E39BA17E6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4562D01B-E184-489C-904B-C9E39BA17E6E}.Release|Any CPU.Build.0 = Release|Any CPU - {B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD}.Release|Any CPU.Build.0 = Release|Any CPU - {9A87BAA2-F521-45B1-AF93-9BC642FD8C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9A87BAA2-F521-45B1-AF93-9BC642FD8C76}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9A87BAA2-F521-45B1-AF93-9BC642FD8C76}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9A87BAA2-F521-45B1-AF93-9BC642FD8C76}.Release|Any CPU.Build.0 = Release|Any CPU - {F8F86538-AFA4-4CD9-9DF7-C870F85F4608}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8F86538-AFA4-4CD9-9DF7-C870F85F4608}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8F86538-AFA4-4CD9-9DF7-C870F85F4608}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8F86538-AFA4-4CD9-9DF7-C870F85F4608}.Release|Any CPU.Build.0 = Release|Any CPU - {8670E175-EB04-4FDC-9D04-8FB0839CCF49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8670E175-EB04-4FDC-9D04-8FB0839CCF49}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8670E175-EB04-4FDC-9D04-8FB0839CCF49}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8670E175-EB04-4FDC-9D04-8FB0839CCF49}.Release|Any CPU.Build.0 = Release|Any CPU - {6DE044E7-2804-48AD-8EF1-EC804A2C0395}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6DE044E7-2804-48AD-8EF1-EC804A2C0395}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DE044E7-2804-48AD-8EF1-EC804A2C0395}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6DE044E7-2804-48AD-8EF1-EC804A2C0395}.Release|Any CPU.Build.0 = Release|Any CPU - {3F33D1B3-7AD9-44A3-B5F4-048BED3913C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F33D1B3-7AD9-44A3-B5F4-048BED3913C8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F33D1B3-7AD9-44A3-B5F4-048BED3913C8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F33D1B3-7AD9-44A3-B5F4-048BED3913C8}.Release|Any CPU.Build.0 = Release|Any CPU - {8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545}.Release|Any CPU.Build.0 = Release|Any CPU - {D75819AA-3092-43F6-80D2-1BF2FCAA92EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D75819AA-3092-43F6-80D2-1BF2FCAA92EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D75819AA-3092-43F6-80D2-1BF2FCAA92EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D75819AA-3092-43F6-80D2-1BF2FCAA92EE}.Release|Any CPU.Build.0 = Release|Any CPU - {6BACA326-54B0-4832-B16E-1419083EECFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BACA326-54B0-4832-B16E-1419083EECFD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BACA326-54B0-4832-B16E-1419083EECFD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BACA326-54B0-4832-B16E-1419083EECFD}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {91EBC1B7-0F17-4E4E-96AF-A9D5445344AB} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {0F69048E-9C05-4BE1-9C73-F703B8ACC8C4} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {5416CB30-1728-43C9-A7DE-D3463E35866D} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {E0B64023-B487-4B0E-9A2B-B9E28D1E7964} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {2D69D9AA-19E2-469D-BCA4-ED972721E005} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {108216D7-4552-4397-AC5A-5C3346D65BFB} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {DEA4D5EC-DD8A-48D6-B859-55D95F46CC06} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {EE12FAB6-FEA2-4819-ABAF-B38319325F35} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {4562D01B-E184-489C-904B-C9E39BA17E6E} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {B8194FFD-8C4D-46AA-B1FA-A3EE195AF0FD} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {9A87BAA2-F521-45B1-AF93-9BC642FD8C76} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {F8F86538-AFA4-4CD9-9DF7-C870F85F4608} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {8670E175-EB04-4FDC-9D04-8FB0839CCF49} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {6DE044E7-2804-48AD-8EF1-EC804A2C0395} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - {3F33D1B3-7AD9-44A3-B5F4-048BED3913C8} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {8FF7EF9D-DDBB-4D25-B3A5-5E0D11462545} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {D75819AA-3092-43F6-80D2-1BF2FCAA92EE} = {F39DCB66-0A9F-47BA-A916-301EC83F26EA} - {6BACA326-54B0-4832-B16E-1419083EECFD} = {A4F3156B-9E74-4710-ADBC-4628DF389F68} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {DFD408B5-CCB3-4B3A-9E3B-DC85C74256B1} - EndGlobalSection -EndGlobal diff --git a/Atc.Rest.Api.Generator.slnx b/Atc.Rest.Api.Generator.slnx new file mode 100644 index 00000000..2c5574cc --- /dev/null +++ b/Atc.Rest.Api.Generator.slnx @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +