| File: StaticRouteHandlerModel\Emitters\EndpointJsonPreparationEmitter.cs | Web Access |
| Project: src\aspnetcore\src\Http\Http.Extensions\gen\Microsoft.AspNetCore.Http.RequestDelegateGenerator\Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj (Microsoft.AspNetCore.Http.RequestDelegateGenerator) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.CodeAnalysis; namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; internal static class EndpointJsonPreparationEmitter { internal static void EmitJsonPreparation(this Endpoint endpoint, CodeWriter codeWriter) { codeWriter.WriteLine("var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? FallbackJsonOptions;"); codeWriter.WriteLine("var jsonSerializerOptions = jsonOptions.SerializerOptions;"); codeWriter.WriteLine("jsonSerializerOptions.MakeReadOnly();"); codeWriter.WriteLine($"var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonSerializerOptions.GetTypeInfo(typeof(object));"); if (endpoint.Response?.IsSerializableJsonResponse(out var responseType) == true) { var typeName = responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability); codeWriter.WriteLine($"var responseJsonTypeInfo = (JsonTypeInfo<{responseType.ToDisplayString(NullableFlowState.MaybeNull, EmitterConstants.DisplayFormat)}>)jsonSerializerOptions.GetTypeInfo(typeof({typeName}));"); } foreach (var parameter in endpoint.Parameters) { ProcessParameter(parameter, codeWriter); if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: {} innerParameters }) { foreach (var innerParameter in innerParameters) { ProcessParameter(innerParameter, codeWriter); } } } static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter) { if (parameter.Source != EndpointParameterSource.JsonBody) { return; } var typeName = parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat); codeWriter.WriteLine($"var {parameter.SymbolName}_JsonTypeInfo = (JsonTypeInfo<{typeName}>)jsonSerializerOptions.GetTypeInfo(typeof({parameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}));"); } } internal static string EmitJsonResponse(this EndpointResponse endpointResponse) { if (endpointResponse.ResponseType != null && (endpointResponse.ResponseType.IsSealed || endpointResponse.ResponseType.IsValueType)) { return "httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);"; } return "GeneratedRouteBuilderExtensionsCore.WriteJsonResponseAsync(httpContext.Response, result, responseJsonTypeInfo);"; } }