1- using System ;
2- using System . IO ;
3- using Microsoft . OpenApi ;
4- using OpenAPI . WebApiGenerator . Extensions ;
1+ using Microsoft . OpenApi ;
2+ using OpenAPI . WebApiGenerator . OpenApi ;
53
64namespace OpenAPI . WebApiGenerator . CodeGeneration ;
75
@@ -11,47 +9,25 @@ internal sealed class HttpResponseExtensionsGenerator(
119{
1210 private const string HttpResponseExtensionsClassName = "HttpResponseExtensions" ;
1311 public string Namespace => @namespace ;
14-
12+
1513 internal string GetResponseHeaderSpecificationAsJson (
1614 IOpenApiHeader header ,
17- string name )
18- {
19- using var textWriter = new StringWriter ( ) ;
20- var jsonWriter = new OpenApiJsonWriter ( textWriter , new OpenApiJsonWriterSettings
21- {
22- InlineLocalReferences = true
23- } ) ;
24- Action < IOpenApiWriter > serialize = openApiVersion switch
25- {
26- OpenApiSpecVersion . OpenApi3_1 => header . SerializeAsV31 ,
27- OpenApiSpecVersion . OpenApi3_0 => header . SerializeAsV3 ,
28- OpenApiSpecVersion . OpenApi2_0 => header . SerializeAsV2 ,
29- _ => throw new NotSupportedException (
30- $ "OpenAPI version { Enum . GetName ( typeof ( OpenApiSpecVersion ) , openApiVersion ) } not supported")
31- } ;
32- serialize ( jsonWriter ) ;
33- textWriter . Flush ( ) ;
34-
15+ string name ) =>
3516 // Response header specification is a subset of the parameter specification, so we add the missing properties to be able to use the parameter value parser
36- return
37- $$ """
38- {
39- "name": "{{ name }} ",
40- "in": "header",
41- {{ textWriter . GetStringBuilder ( ) . ToString ( ) . TrimStart ( '{' ) . TrimStart ( ) }}
42- """ ;
43- }
44-
45- internal string CreateWriteBodyInvocation (
17+ $$ """
18+ {
19+ "name": "{{ name }} ",
20+ "in": "header",
21+ {{ header . Serialize ( openApiVersion ) . ToString ( ) . TrimStart ( '{' ) . TrimStart ( ) }}
22+ """ ;
23+
24+ internal static string CreateWriteBodyInvocation (
4625 string responseVariableName ,
47- string contentVariableName )
48- {
49- return
50- $ """
51- { responseVariableName } .WriteResponseBody({ contentVariableName } )
52- """ ;
53- }
54-
26+ string contentVariableName ) =>
27+ $ """
28+ { responseVariableName } .WriteResponseBody({ contentVariableName } )
29+ """ ;
30+
5531 internal SourceCode GenerateHttpResponseExtensionsClass ( ) =>
5632 new ( $ "{ HttpResponseExtensionsClassName } .g.cs",
5733 $$$ """"
@@ -62,17 +38,18 @@ internal SourceCode GenerateHttpResponseExtensionsClass() =>
6238 using Corvus.Json;
6339 using Microsoft.AspNetCore.Http;
6440 using Microsoft.Extensions.Primitives;
65- using OpenAPI.ParameterStyleParsers.OpenApi20;
66- using OpenAPI.ParameterStyleParsers.OpenApi20.ParameterParsers;
41+ using OpenAPI.ParameterStyleParsers;
6742 using JsonObject = System.Text.Json.Nodes.JsonObject;
6843
6944 namespace {{{ @namespace }}} ;
7045
7146 internal static class {{{ HttpResponseExtensionsClassName }}}
7247 {
73- private static readonly ConcurrentDictionary<Parameter, ParameterValueParser> ParserCache = new();
74-
75- internal static void WriteResponseHeader<TValue>(this HttpResponse response,
48+ private static readonly ConcurrentDictionary<IParameter, IParameterValueParser> ParserCache = new();
49+ private static IParameterValueParser GetParser(IParameter parameter) => ParserCache.GetOrAdd(parameter, _ => parameter.CreateParameterValueParser());
50+
51+ internal static void WriteResponseHeader<TValue>(this HttpResponse response,
52+ string openApiVersion,
7653 string headerSpecificationAsJson,
7754 string name,
7855 TValue value,
@@ -86,7 +63,7 @@ internal static void WriteResponseHeader<TValue>(this HttpResponse response,
8663
8764 Validate(value);
8865
89- var parameter = Parameter.FromOpenApi20ParameterSpecification( headerSpecificationAsJson);
66+ var parameter = ParameterFactory.OpenApi(openApiVersion, headerSpecificationAsJson);
9067 var serializedValue = Serialize(parameter, name, value);
9168 response.Headers[name] = serializedValue;
9269 }
@@ -100,10 +77,10 @@ internal static void WriteResponseBody<TValue>(this HttpResponse response, TValu
10077 value.WriteTo(jsonWriter);
10178 }
10279
103- private static string? Serialize<TValue>(Parameter parameter, string name, TValue jsonValue)
80+ private static string? Serialize<TValue>(IParameter parameter, string name, TValue jsonValue)
10481 where TValue : struct, IJsonValue
10582 {
106- var parser = ParserCache.GetOrAdd (parameter, ParameterValueParser.Create );
83+ var parser = GetParser (parameter);
10784 var value = jsonValue.Serialize();
10885
10986 return parser.Serialize(JsonNode.Parse(value));
0 commit comments