[
  {
    "path": ".gitattributes",
    "content": "*.doc  diff=astextplain\n*.DOC\tdiff=astextplain\n*.docx\tdiff=astextplain\n*.DOCX\tdiff=astextplain\n*.dot\tdiff=astextplain\n*.DOT\tdiff=astextplain\n*.pdf\tdiff=astextplain\n*.PDF\tdiff=astextplain\n*.rtf\tdiff=astextplain\n*.RTF\tdiff=astextplain\n\n*.jpg  \tbinary\n*.png \tbinary\n*.gif \tbinary\n\n*.cs text=auto diff=csharp \n*.vb text=auto\n*.resx text=auto\n*.c text=auto\n*.cpp text=auto\n*.cxx text=auto\n*.h text=auto\n*.hxx text=auto\n*.py text=auto\n*.rb text=auto\n*.java text=auto\n*.html text=auto\n*.htm text=auto\n*.css text=auto\n*.scss text=auto\n*.sass text=auto\n*.less text=auto\n*.js text=auto\n*.lisp text=auto\n*.clj text=auto\n*.sql text=auto\n*.php text=auto\n*.lua text=auto\n*.m text=auto\n*.asm text=auto\n*.erl text=auto\n*.fs text=auto\n*.fsx text=auto\n*.hs text=auto\n\n*.csproj text=auto\n*.vbproj text=auto\n*.fsproj text=auto\n*.dbproj text=auto\n*.sln text=auto eol=crlf\n\n*.sh eol=lf"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "name: CI\n\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: windows-latest\n\n    steps:\n    - uses: actions/checkout@v1\n\n    - name: Setup .NET Core SDK\n      uses: actions/setup-dotnet@v3\n      with:\n        dotnet-version: 7.0.x\n        dotnet-quality: 'ga'\n\n    - uses: aarnott/nbgv@v0.4.0\n      with:\n        setAllVars: true\n     \n    - name: dotnet build\n      run: dotnet build uController.sln -c Release    \n\n    - name: dotnet test\n      run: dotnet test uController.sln -c Release --no-build\n\n    - name: dotnet pack\n      run: dotnet pack uController.sln -c Release --no-build --include-source --include-symbols\n\n    - name: setup nuget\n      if: github.event_name == 'push' && github.ref == 'refs/heads/main'\n      uses: NuGet/setup-nuget@v1.0.5\n      with:\n        nuget-version: latest\n\n    - name: Set API key\n      if: github.event_name == 'push' && github.ref == 'refs/heads/main'\n      run: nuget setapikey ${{ secrets.FEEDZ_TOKEN }} -Config nuget.config -Source https://f.feedz.io/davidfowl/ucontroller/nuget/index.json\n\n    - name: Set symbols API key\n      if: github.event_name == 'push' && github.ref == 'refs/heads/main'\n      run: nuget setapikey ${{ secrets.FEEDZ_TOKEN }} -Config nuget.config -Source https://f.feedz.io/davidfowl/ucontroller/symbols\n\n    - name: push packages\n      if: github.event_name == 'push' && github.ref == 'refs/heads/main'\n      run: dotnet nuget push **/*.nupkg -s https://f.feedz.io/davidfowl/ucontroller/nuget/index.json -ss https://f.feedz.io/davidfowl/ucontroller/symbols --skip-duplicate\n"
  },
  {
    "path": ".gitignore",
    "content": "[Oo]bj/\n[Bb]in/\nTestResults/\n.nuget/\n*.sln.ide/\n_ReSharper.*/\n.idea/\npackages/\nartifacts/\nPublishProfiles/\n.vs/\n*.user\n*.suo\n*.cache\n*.docstates\n_ReSharper.*\nnuget.exe\n*net45.csproj\n*net451.csproj\n*k10.csproj\n*.psess\n*.vsp\n*.pidb\n*.userprefs\n*DS_Store\n*.ncrunchsolution\n*.*sdf\n*.ipch\n*.swp\n*~\n.build/\n.testPublish/\nlaunchSettings.json\nBenchmarkDotNet.Artifacts/\nBDN.Generated/\nbinaries/\nglobal.json\nkorebuild-lock.txt\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \".NET Core Launch (console)\",\n            \"type\": \"coreclr\",\n            \"request\": \"launch\",\n            \"preLaunchTask\": \"build\",\n            \"program\": \"${workspaceFolder}/test/uController.SourceGenerator.Tests/bin/Debug/net7.0/uController.SourceGenerator.Tests.dll\",\n            \"args\": [],\n            \"cwd\": \"${workspaceFolder}/test/uController.SourceGenerator.Tests\",\n            \"console\": \"internalConsole\",\n            \"stopAtEntry\": false\n        },\n        {\n            \"name\": \".NET Core Attach\",\n            \"type\": \"coreclr\",\n            \"request\": \"attach\"\n        }\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"dotnet.defaultSolution\": \"uController.sln\"\n}"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"build\",\n                \"${workspaceFolder}/test/uController.SourceGenerator.Tests/uController.SourceGenerator.Tests.csproj\",\n                \"/property:GenerateFullPaths=true\",\n                \"/consoleloggerparameters:NoSummary\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        },\n        {\n            \"label\": \"publish\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"publish\",\n                \"${workspaceFolder}/test/uController.SourceGenerator.Tests/uController.SourceGenerator.Tests.csproj\",\n                \"/property:GenerateFullPaths=true\",\n                \"/consoleloggerparameters:NoSummary\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        },\n        {\n            \"label\": \"watch\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"watch\",\n                \"run\",\n                \"--project\",\n                \"${workspaceFolder}/test/uController.SourceGenerator.Tests/uController.SourceGenerator.Tests.csproj\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        }\n    ]\n}"
  },
  {
    "path": "Directory.Build.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>\n    <NoWarn>$(NoWarn);NU5105</NoWarn>\n    <RepositoryUrl>https://github.com/davidfowl/uController</RepositoryUrl>\n    <PackageProjectUrl>https://github.com/davidfowl/uController</PackageProjectUrl>\n    <PackageReleaseNotes>https://github.com/davidfowl/uController/releases</PackageReleaseNotes>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <RepositoryType>git</RepositoryType>\n    <PackageTags>cloud API REST microservice web</PackageTags>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Nerdbank.GitVersioning\" Version=\"3.5.119\" PrivateAssets=\"All\" />\n    <PackageReference Include=\"Microsoft.SourceLink.GitHub\" Version=\"1.1.1\" PrivateAssets=\"All\"/>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "GeneratedOutput/RouteBuilderExtensions.g.cs",
    "content": "﻿\n//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\n#if NET7_0_OR_GREATER\nusing System.Diagnostics;\nusing System.Reflection;\nusing Microsoft.AspNetCore.Routing.Patterns;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.FileProviders;\nusing Microsoft.Extensions.Primitives;\n\nusing MetadataPopulator = System.Action<System.Delegate, Microsoft.AspNetCore.Builder.EndpointBuilder>;\nusing RequestDelegateFactoryFunc = System.Func<System.Delegate, Microsoft.AspNetCore.Builder.EndpointBuilder, Microsoft.AspNetCore.Http.RequestDelegate>;\n\nnamespace Microsoft.AspNetCore.Builder\n{\n    internal record SourceKey(string Path, int Line);\n}\n\ninternal static class GeneratedRouteBuilderExtensions\n{\n    private static readonly string[] GetVerb = new[] { HttpMethods.Get };\n    private static readonly string[] PostVerb = new[] { HttpMethods.Post };\n    private static readonly string[] PutVerb = new[]  { HttpMethods.Put };\n    private static readonly string[] DeleteVerb = new[] { HttpMethods.Delete };\n    private static readonly string[] PatchVerb = new[] { HttpMethods.Patch };\n\n    private class GenericThunks<T>\n    {\n        public static readonly System.Collections.Generic.Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()\n        {\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 19)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 19));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(T)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<T>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler());\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = handler();\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n\n        };\n    }\n\n    private static readonly System.Collections.Generic.Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()\n    {\n            [(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 9)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 9));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(System.Collections.Generic.List<Todo>)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<TodoDbContext, System.Threading.Tasks.Task<System.Collections.Generic.List<Todo>>>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<TodoDbContext>> arg_dbServiceOrBodyResolver = (ispis?.IsService(typeof(TodoDbContext)) ?? false) ? ResolveService<TodoDbContext> : ResolveBody<TodoDbContext>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<TodoDbContext>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    var result = await handler(arg_db);\n                    await httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_db));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 17)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 17));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Ok<Todo>>(del.Method, builder);\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.NotFound>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<TodoDbContext>> arg_dbServiceOrBodyResolver = (ispis?.IsService(typeof(TodoDbContext)) ?? false) ? ResolveService<TodoDbContext> : ResolveBody<TodoDbContext>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0), ic.GetArgument<TodoDbContext>(1)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return;\n                    }\n                    var result = await handler(arg_id, arg_db);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id, arg_db));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 29)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 29));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.NotFound>(del.Method, builder);\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.NoContent>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, Todo, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<Todo>> arg_todoServiceOrBodyResolver = (ispis?.IsService(typeof(Todo)) ?? false) ? ResolveService<Todo> : ResolveBody<Todo>;\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<TodoDbContext>> arg_dbServiceOrBodyResolver = (ispis?.IsService(typeof(TodoDbContext)) ?? false) ? ResolveService<TodoDbContext> : ResolveBody<TodoDbContext>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0), ic.GetArgument<Todo>(1), ic.GetArgument<TodoDbContext>(2)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_todo = await arg_todoServiceOrBodyResolver(httpContext);\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return;\n                    }\n                    var result = await handler(arg_id, arg_todo, arg_db);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_todo = await arg_todoServiceOrBodyResolver(httpContext);\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id, arg_todo, arg_db));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 48)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 48));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Created<Todo>>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Todo, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<Todo>> arg_todoServiceOrBodyResolver = (ispis?.IsService(typeof(Todo)) ?? false) ? ResolveService<Todo> : ResolveBody<Todo>;\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<TodoDbContext>> arg_dbServiceOrBodyResolver = (ispis?.IsService(typeof(TodoDbContext)) ?? false) ? ResolveService<TodoDbContext> : ResolveBody<TodoDbContext>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Todo>(0), ic.GetArgument<TodoDbContext>(1)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_todo = await arg_todoServiceOrBodyResolver(httpContext);\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    var result = await handler(arg_todo, arg_db);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_todo = await arg_todoServiceOrBodyResolver(httpContext);\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_todo, arg_db));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 58)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\MapTodos.cs\", 58));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Ok<Todo>>(del.Method, builder);\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.NotFound>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<TodoDbContext>> arg_dbServiceOrBodyResolver = (ispis?.IsService(typeof(TodoDbContext)) ?? false) ? ResolveService<TodoDbContext> : ResolveBody<TodoDbContext>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0), ic.GetArgument<TodoDbContext>(1)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return;\n                    }\n                    var result = await handler(arg_id, arg_db);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = httpContext.Request.RouteValues[\"id\"]?.ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_db = await arg_dbServiceOrBodyResolver(httpContext);\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id, arg_db));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 16)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 16));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler());\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = handler();\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 17)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 17));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = httpContext.Request.RouteValues[\"name\"]?.ToString();\n                    var result = handler(arg_name);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = httpContext.Request.RouteValues[\"name\"]?.ToString();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_name));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 21)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 21));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(Person)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Person>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler());\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = handler();\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 23)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 23));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Ok<string>>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.Security.Claims.ClaimsPrincipal, ISayHello, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<ISayHello>> arg_hellosvcServiceOrBodyResolver = (ispis?.IsService(typeof(ISayHello)) ?? false) ? ResolveService<ISayHello> : ResolveBody<ISayHello>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.Security.Claims.ClaimsPrincipal>(0), ic.GetArgument<ISayHello>(1)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_c = httpContext.User;\n                    var arg_hellosvc = await arg_hellosvcServiceOrBodyResolver(httpContext);\n                    var result = handler(arg_c, arg_hellosvc);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_c = httpContext.User;\n                    var arg_hellosvc = await arg_hellosvcServiceOrBodyResolver(httpContext);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_c, arg_hellosvc));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 25)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 25));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(System.Text.Json.Nodes.JsonNode)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.Text.Json.Nodes.JsonNode, System.Text.Json.Nodes.JsonNode>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\n                System.Func<HttpContext, System.Threading.Tasks.ValueTask<System.Text.Json.Nodes.JsonNode>> arg_nodeServiceOrBodyResolver = (ispis?.IsService(typeof(System.Text.Json.Nodes.JsonNode)) ?? false) ? ResolveService<System.Text.Json.Nodes.JsonNode> : ResolveBody<System.Text.Json.Nodes.JsonNode>;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.Text.Json.Nodes.JsonNode>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_node = await arg_nodeServiceOrBodyResolver(httpContext);\n                    var result = handler(arg_node);\n                    await httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_node = await arg_nodeServiceOrBodyResolver(httpContext);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_node));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 26)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 26));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(System.Text.Json.Nodes.JsonNode)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.Text.Json.Nodes.JsonNode, System.Text.Json.Nodes.JsonNode>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.Text.Json.Nodes.JsonNode>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_node = await ResolveBody<System.Text.Json.Nodes.JsonNode>(httpContext);\n                    var result = handler(arg_node);\n                    await httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_node = await ResolveBody<System.Text.Json.Nodes.JsonNode>(httpContext);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_node));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 28)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 28));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(Model)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Model, Model>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var parameterInfos = del.Method.GetParameters();\n                var arg_mParameterInfo = parameterInfos[0];\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Model>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_m = await Model.BindAsync(httpContext, arg_mParameterInfo);\n                    var result = handler(arg_m);\n                    await httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_m = await Model.BindAsync(httpContext, arg_mParameterInfo);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_m));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 29)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 29));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<Model>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var parameterInfos = del.Method.GetParameters();\n                var arg_mParameterInfo = parameterInfos[0];\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<Model>(0));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_m = await Model.BindAsync(httpContext, arg_mParameterInfo);\n                    handler(arg_m);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_m = await Model.BindAsync(httpContext, arg_mParameterInfo);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_m));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 31)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 31));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Microsoft.AspNetCore.Http.IFormFile, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Microsoft.AspNetCore.Http.IFormFile>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var formCollection = await httpContext.Request.ReadFormAsync();\n                    var arg_file = formCollection.Files[\"file\"];\n                    var result = handler(arg_file);\n                    await httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var formCollection = await httpContext.Request.ReadFormAsync();\n                    var arg_file = formCollection.Files[\"file\"];\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_file));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 36)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 36));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.NotFound>(del.Method, builder);\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Ok<string>>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_nameRouteOrQueryResolver = routePattern?.GetParameter(\"name\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = handler(arg_name);\n                    return result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_name));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 39)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 39));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Microsoft.AspNetCore.Http.IFormCollection, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Microsoft.AspNetCore.Http.IFormCollection>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var formCollection = await httpContext.Request.ReadFormAsync();\n                    var arg_formCollection = formCollection;\n                    var result = handler(arg_formCollection);\n                    await httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var formCollection = await httpContext.Request.ReadFormAsync();\n                    var arg_formCollection = formCollection;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_formCollection));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 44)] = (\n           (del, builder) => \n            {\n                var parameterInfos = del.Method.GetParameters();\n                PopulateMetadata<MinimalApis.Extensions.Binding.Body<string>>(parameterInfos[0], builder);\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 44));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<MinimalApis.Extensions.Binding.Body<string>, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var parameterInfos = del.Method.GetParameters();\n                var arg_bodyParameterInfo = parameterInfos[0];\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<MinimalApis.Extensions.Binding.Body<string>>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_body = await MinimalApis.Extensions.Binding.Body<string>.BindAsync(httpContext, arg_bodyParameterInfo);\n                    var result = handler(arg_body);\n                    await httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_body = await MinimalApis.Extensions.Binding.Body<string>.BindAsync(httpContext, arg_bodyParameterInfo);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_body));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 46)] = (\n           (del, builder) => \n            {\n                var parameterInfos = del.Method.GetParameters();\n                PopulateMetadata<MinimalApis.Extensions.Binding.Validated<Model>>(parameterInfos[0], builder);\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 46));\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.ValidationProblem>(del.Method, builder);\n                PopulateMetadata<Microsoft.AspNetCore.Http.HttpResults.Ok>(del.Method, builder);\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<MinimalApis.Extensions.Binding.Validated<Model>, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var parameterInfos = del.Method.GetParameters();\n                var arg_modelParameterInfo = parameterInfos[0];\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<MinimalApis.Extensions.Binding.Validated<Model>>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                async System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_model = await MinimalApis.Extensions.Binding.Validated<Model>.BindAsync(httpContext, arg_modelParameterInfo);\n                    var result = handler(arg_model);\n                    await result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_model = await MinimalApis.Extensions.Binding.Validated<Model>.BindAsync(httpContext, arg_modelParameterInfo);\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_model));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 55)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 55));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(object)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.Threading.CancellationToken, object>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.Threading.CancellationToken>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_ct = httpContext.RequestAborted;\n                    var result = handler(arg_ct);\n                    return ExecuteObjectResult(result, httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_ct = httpContext.RequestAborted;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_ct));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 59)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 59));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(401));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int?, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_idRouteOrQueryResolver = routePattern?.GetParameter(\"id\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int?>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int? arg_id;\n                    if (arg_id_Value != null && int.TryParse(arg_id_Value, out var arg_id_Temp))\n                    {\n                        arg_id = arg_id_Temp;\n                    }\n                    else\n                    {\n                        arg_id = default;\n                    }\n                    var result = handler(arg_id);\n                    return result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int? arg_id;\n                    if (arg_id_Value != null && int.TryParse(arg_id_Value, out var arg_id_Temp))\n                    {\n                        arg_id = arg_id_Temp;\n                    }\n                    else\n                    {\n                        arg_id = default;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 61)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 61));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.IO.Stream, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.IO.Stream>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_s = httpContext.Request.Body;\n                    var result = handler(arg_s);\n                    return result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_s = httpContext.Request.Body;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_s));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 62)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 62));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<System.IO.Pipelines.PipeReader, Microsoft.AspNetCore.Http.IResult>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<System.IO.Pipelines.PipeReader>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_r = httpContext.Request.BodyReader;\n                    var result = handler(arg_r);\n                    return result.ExecuteAsync(httpContext);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_r = httpContext.Request.BodyReader;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_r));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 64)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 64));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Microsoft.AspNetCore.Http.HttpRequest, Microsoft.AspNetCore.Http.HttpResponse, System.Threading.Tasks.Task>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Microsoft.AspNetCore.Http.HttpRequest>(0), ic.GetArgument<Microsoft.AspNetCore.Http.HttpResponse>(1)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_req = httpContext.Request;\n                    var arg_resp = httpContext.Response;\n                    return handler(arg_req, arg_resp);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_req = httpContext.Request;\n                    var arg_resp = httpContext.Response;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_req, arg_resp));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 66)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 66));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(string?[])));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Microsoft.Extensions.Primitives.StringValues, string?[]>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_queriesRouteOrQueryResolver = routePattern?.GetParameter(\"queries\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Microsoft.Extensions.Primitives.StringValues>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_queries = arg_queriesRouteOrQueryResolver(httpContext, \"queries\");\n                    var result = handler(arg_queries);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_queries = arg_queriesRouteOrQueryResolver(httpContext, \"queries\");\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_queries));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 67)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 67));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(string[])));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string[], string[]>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_queriesRouteOrQueryResolver = routePattern?.GetParameter(\"queries\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string[]>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_queries = arg_queriesRouteOrQueryResolver(httpContext, \"queries\").ToArray();\n                    var result = handler(arg_queries);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_queries = arg_queriesRouteOrQueryResolver(httpContext, \"queries\").ToArray();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_queries));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 68)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 68));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int[])));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int[], int[]>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_queriesRouteOrQueryResolver = routePattern?.GetParameter(\"queries\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int[]>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_queries_Value = arg_queriesRouteOrQueryResolver(httpContext, \"queries\").ToArray();\n                    int[] arg_queries = default;\n                    for (var i = 0; i < arg_queries.Length; i++)\n                    {\n                        arg_queries ??= new int[arg_queries_Value.Length];\n                        if (arg_queries_Value[i] == null || !int.TryParse(arg_queries_Value[i], out arg_queries[i]))\n                        {\n                            arg_queries[i] = default;\n                            wasParamCheckFailure = true;\n                        }\n                    }\n                    arg_queries ??= System.Array.Empty<int>();\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_queries);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_queries_Value = arg_queriesRouteOrQueryResolver(httpContext, \"queries\").ToArray();\n                    int[] arg_queries = default;\n                    for (var i = 0; i < arg_queries.Length; i++)\n                    {\n                        arg_queries ??= new int[arg_queries_Value.Length];\n                        if (arg_queries_Value[i] == null || !int.TryParse(arg_queries_Value[i], out arg_queries[i]))\n                        {\n                            arg_queries[i] = default;\n                            wasParamCheckFailure = true;\n                        }\n                    }\n                    arg_queries ??= System.Array.Empty<int>();\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_queries));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 73)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 73));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(Person)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Person>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler());\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = handler();\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 79)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 79));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_idRouteOrQueryResolver = routePattern?.GetParameter(\"id\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_id);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 81)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 81));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_nameRouteOrQueryResolver = routePattern?.GetParameter(\"name\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = handler(arg_name);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_name));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 82)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 82));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_nameRouteOrQueryResolver = routePattern?.GetParameter(\"name\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = handler(arg_name);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = arg_nameRouteOrQueryResolver(httpContext, \"name\").ToString();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_name));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 84)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 84));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Choices, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Choices>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_c_Value = httpContext.Request.RouteValues[\"c\"]?.ToString();\n                    Choices arg_c;\n                    if (arg_c_Value == null || !System.Enum.TryParse(arg_c_Value, true, out arg_c))\n                    {\n                        arg_c = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_c);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_c_Value = httpContext.Request.RouteValues[\"c\"]?.ToString();\n                    Choices arg_c;\n                    if (arg_c_Value == null || !System.Enum.TryParse(arg_c_Value, true, out arg_c))\n                    {\n                        arg_c = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_c));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 103)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 103));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_x);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 104)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 104));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_yRouteOrQueryResolver = routePattern?.GetParameter(\"y\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<int>(0), ic.GetArgument<int>(1));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    handler(arg_x, arg_y);\n                    return System.Threading.Tasks.Task.CompletedTask;\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x, arg_y));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 105)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 105));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_x);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 106)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 106));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_yRouteOrQueryResolver = routePattern?.GetParameter(\"y\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<int>(0), ic.GetArgument<int>(1));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    handler(arg_x, arg_y);\n                    return System.Threading.Tasks.Task.CompletedTask;\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x, arg_y));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 107)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 107));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_x);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 108)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 108));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_yRouteOrQueryResolver = routePattern?.GetParameter(\"y\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<int>(0), ic.GetArgument<int>(1));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    handler(arg_x, arg_y);\n                    return System.Threading.Tasks.Task.CompletedTask;\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x, arg_y));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 109)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 109));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_x);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 110)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 110));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_yRouteOrQueryResolver = routePattern?.GetParameter(\"y\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<int>(0), ic.GetArgument<int>(1));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    handler(arg_x, arg_y);\n                    return System.Threading.Tasks.Task.CompletedTask;\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x, arg_y));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 111)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 111));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_x);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 112)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 112));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Action<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_xRouteOrQueryResolver = routePattern?.GetParameter(\"x\") is null ? ResolveByQuery : ResolveByRoute;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_yRouteOrQueryResolver = routePattern?.GetParameter(\"y\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        handler(ic.GetArgument<int>(0), ic.GetArgument<int>(1));\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    handler(arg_x, arg_y);\n                    return System.Threading.Tasks.Task.CompletedTask;\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_x_Value = arg_xRouteOrQueryResolver(httpContext, \"x\").ToString();\n                    int arg_x;\n                    if (arg_x_Value == null || !int.TryParse(arg_x_Value, out arg_x))\n                    {\n                        arg_x = default;\n                        wasParamCheckFailure = true;\n                    }\n                    var arg_y_Value = arg_yRouteOrQueryResolver(httpContext, \"y\").ToString();\n                    int arg_y;\n                    if (arg_y_Value == null || !int.TryParse(arg_y_Value, out arg_y))\n                    {\n                        arg_y = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_x, arg_y));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 113)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 113));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(int)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, int>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_n_Value = httpContext.Request.RouteValues[\"n\"]?.ToString();\n                    int arg_n;\n                    if (arg_n_Value == null || !int.TryParse(arg_n_Value, out arg_n))\n                    {\n                        arg_n = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_n);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_n_Value = httpContext.Request.RouteValues[\"n\"]?.ToString();\n                    int arg_n;\n                    if (arg_n_Value == null || !int.TryParse(arg_n_Value, out arg_n))\n                    {\n                        arg_n = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_n));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 124)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 124));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<string, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<string>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = httpContext.Request.RouteValues[\"name\"]?.ToString();\n                    var result = handler(arg_name);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_name = httpContext.Request.RouteValues[\"name\"]?.ToString();\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_name));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 126)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 126));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"application/json\", typeof(Parsable)));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Parsable, Parsable>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Parsable>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_p_Value = httpContext.Request.Query[\"p\"].ToString();\n                    Parsable arg_p;\n                    if (arg_p_Value == null || !Parsable.TryParse(arg_p_Value, System.Globalization.CultureInfo.InvariantCulture, out arg_p))\n                    {\n                        arg_p = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_p);\n                    return httpContext.Response.WriteAsJsonAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_p_Value = httpContext.Request.Query[\"p\"].ToString();\n                    Parsable arg_p;\n                    if (arg_p_Value == null || !Parsable.TryParse(arg_p_Value, System.Globalization.CultureInfo.InvariantCulture, out arg_p))\n                    {\n                        arg_p = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_p));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 128)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Program.cs\", 128));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<Microsoft.AspNetCore.Http.HttpContext, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<Microsoft.AspNetCore.Http.HttpContext>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_context = httpContext;\n                    var result = handler(arg_context);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var arg_context = httpContext;\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_context));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n            [(@\"C:\\dev\\git\\uController\\samples\\Wrapper.cs\", 15)] = (\n           (del, builder) => \n            {\n\n                builder.Metadata.Add(new SourceKey(@\"C:\\dev\\git\\uController\\samples\\Wrapper.cs\", 15));\n                builder.Metadata.Add(ResponseTypeMetadata.Create(\"text/plain\"));\n            }, \n           (del, builder) => \n            {\n                var handler = (System.Func<int, string>)del;\n                EndpointFilterDelegate filteredInvocation = null;\n                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\n                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues> arg_idRouteOrQueryResolver = routePattern?.GetParameter(\"id\") is null ? ResolveByQuery : ResolveByRoute;\n                if (builder.FilterFactories.Count > 0)\n                {\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {\n                            return System.Threading.Tasks.ValueTask.FromResult<object>(Results.Empty);\n                        }\n                        return System.Threading.Tasks.ValueTask.FromResult<object>(handler(ic.GetArgument<int>(0)));\n                    },\n                    builder,\n                    handler.Method);\n                }\n\n                System.Threading.Tasks.Task RequestHandler(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                        return Task.CompletedTask;\n                    }\n                    var result = handler(arg_id);\n                    return httpContext.Response.WriteAsync(result);\n                }\n                \n                async System.Threading.Tasks.Task RequestHandlerFiltered(Microsoft.AspNetCore.Http.HttpContext httpContext)\n                {\n                    var wasParamCheckFailure = false;\n                    var arg_id_Value = arg_idRouteOrQueryResolver(httpContext, \"id\").ToString();\n                    int arg_id;\n                    if (arg_id_Value == null || !int.TryParse(arg_id_Value, out arg_id))\n                    {\n                        arg_id = default;\n                        wasParamCheckFailure = true;\n                    }\n                    if (wasParamCheckFailure)\n                    {\n                        httpContext.Response.StatusCode = 400;\n                    }\n                    var result = await filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext, arg_id));\n                    await ExecuteObjectResult(result, httpContext);\n                }\n\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }),\n\n\n    };\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<TodoDbContext, System.Threading.Tasks.Task<System.Collections.Generic.List<Todo>>> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PUT requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPut(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, Todo, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PutVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Todo, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP DELETE requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapDelete(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, TodoDbContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Http.IResult>> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, DeleteVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<string, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet<T>(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<T> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore<T>(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Person> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<System.Security.Claims.ClaimsPrincipal, ISayHello, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<System.Text.Json.Nodes.JsonNode, System.Text.Json.Nodes.JsonNode> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Model, Model> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<Model> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Microsoft.AspNetCore.Http.IFormFile, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<string, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Microsoft.AspNetCore.Http.IFormCollection, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<MinimalApis.Extensions.Binding.Body<string>, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<MinimalApis.Extensions.Binding.Validated<Model>, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<System.Threading.CancellationToken, object> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder Map(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int?, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, null, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<System.IO.Stream, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<System.IO.Pipelines.PipeReader, Microsoft.AspNetCore.Http.IResult> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PATCH requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPatch(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Microsoft.AspNetCore.Http.HttpRequest, Microsoft.AspNetCore.Http.HttpResponse, System.Threading.Tasks.Task> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PatchVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Microsoft.Extensions.Primitives.StringValues, string?[]> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<string[], string[]> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int[], int[]> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Choices, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder Map(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, null, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder Map(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, null, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PUT requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPut(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PutVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PUT requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPut(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PutVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP POST requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PostVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP DELETE requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapDelete(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, DeleteVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP DELETE requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapDelete(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, DeleteVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PATCH requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPatch(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PatchVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP PATCH requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPatch(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Action<int, int> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, PatchVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Parsable, Parsable> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n        /// <summary>\n        /// Adds a <see cref=\"RouteEndpoint\"/> to the <see cref=\"IEndpointRouteBuilder\"/> that matches HTTP GET requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"endpoints\">The <see cref=\"IEndpointRouteBuilder\"/> to add the route to.</param>\n        /// <param name=\"pattern\">The route pattern.</param>\n        /// <param name=\"handler\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"RouteHandlerBuilder\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, System.Func<Microsoft.AspNetCore.Http.HttpContext, string> handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {\n            return MapCore(endpoints, pattern, handler, GetVerb, filePath, lineNumber);\n        }\n\n    private static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapCore<T>(\n        this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder routes, \n        string pattern, \n        System.Delegate handler,\n        IEnumerable<string> httpMethods,\n        string filePath,\n        int lineNumber)\n    {\n        var (populate, factory) = GenericThunks<T>.map[(filePath, lineNumber)];\n\n        return GetOrAddRouteEndpointDataSource(routes).AddRouteHandler(RoutePatternFactory.Parse(pattern), handler, httpMethods, isFallback: false, populate, factory);\n    }\n\n    private static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapCore(\n        this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder routes, \n        string pattern, \n        System.Delegate handler,\n        IEnumerable<string> httpMethods,\n        string filePath,\n        int lineNumber)\n    {\n        var (populate, factory) = map[(filePath, lineNumber)];\n\n        return GetOrAddRouteEndpointDataSource(routes).AddRouteHandler(RoutePatternFactory.Parse(pattern), handler, httpMethods, isFallback: false, populate, factory);\n    }\n\n    private static SourceGeneratedRouteEndpointDataSource GetOrAddRouteEndpointDataSource(IEndpointRouteBuilder endpoints)\n    {\n        SourceGeneratedRouteEndpointDataSource routeEndpointDataSource = null;\n\n        foreach (var dataSource in endpoints.DataSources)\n        {\n            if (dataSource is SourceGeneratedRouteEndpointDataSource foundDataSource)\n            {\n                routeEndpointDataSource = foundDataSource;\n                break;\n            }\n        }\n\n        if (routeEndpointDataSource is null)\n        {\n            routeEndpointDataSource = new SourceGeneratedRouteEndpointDataSource(endpoints.ServiceProvider);\n            endpoints.DataSources.Add(routeEndpointDataSource);\n        }\n\n        return routeEndpointDataSource;\n    }\n\n    private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, System.Reflection.MethodInfo mi)\n    {\n        var routeHandlerFilters =  builder.FilterFactories;\n\n        var context0 = new EndpointFilterFactoryContext\n        {\n            MethodInfo = mi,\n            ApplicationServices = builder.ApplicationServices,\n        };\n\n        var initialFilteredInvocation = filteredInvocation;\n\n        for (var i = routeHandlerFilters.Count - 1; i >= 0; i--)\n        {\n            var filterFactory = routeHandlerFilters[i];\n            filteredInvocation = filterFactory(context0, filteredInvocation);\n        }\n\n        return filteredInvocation;\n    }\n\n    private static void PopulateMetadata<T>(System.Reflection.MethodInfo method, EndpointBuilder builder) where T : Microsoft.AspNetCore.Http.Metadata.IEndpointMetadataProvider\n    {\n        T.PopulateMetadata(method, builder);\n    }\n\n    private static void PopulateMetadata<T>(System.Reflection.ParameterInfo parameter, EndpointBuilder builder) where T : Microsoft.AspNetCore.Http.Metadata.IEndpointParameterMetadataProvider\n    {\n        T.PopulateMetadata(parameter, builder);\n    }\n\n    private static Task ExecuteObjectResult(object obj, HttpContext httpContext)\n    {\n        if (obj is IResult r)\n        {\n            return r.ExecuteAsync(httpContext);\n        }\n        else if (obj is string s)\n        {\n            return httpContext.Response.WriteAsync(s);\n        }\n        else\n        {\n            return httpContext.Response.WriteAsJsonAsync(obj);\n        }\n    }\n\n    private static Microsoft.Extensions.Primitives.StringValues ResolveByQuery(HttpContext context, string key) => context.Request.Query[key];\n    private static Microsoft.Extensions.Primitives.StringValues ResolveByRoute(HttpContext context, string key) => context.Request.RouteValues[key]?.ToString();\n    private static ValueTask<T> ResolveService<T>(HttpContext httpContext) => new ValueTask<T>(httpContext.RequestServices.GetRequiredService<T>());\n    private static async ValueTask<T> ResolveBody<T>(HttpContext httpContext)\n    {\n        var feature = httpContext.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpRequestBodyDetectionFeature>();\n\n        if (feature?.CanHaveBody == true)\n        {\n            if (!httpContext.Request.HasJsonContentType())\n            {\n                httpContext.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;\n                return default;\n            }\n            try\n            {\n                return await httpContext.Request.ReadFromJsonAsync<T>();\n            }\n            catch (IOException)\n            {\n                return default;\n            }\n            catch (System.Text.Json.JsonException)\n            {\n                httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;\n                return default;\n            }\n        }\n        return default;\n    }\n\n    private sealed class ResponseTypeMetadata : Microsoft.AspNetCore.Http.Metadata.IProducesResponseTypeMetadata\n    {\n        public Type Type { get; set; } = typeof(void);\n\n        public int StatusCode { get; set; } = 200;\n\n        public IEnumerable<string> ContentTypes { get; init; } = Enumerable.Empty<string>();\n\n        public static ResponseTypeMetadata Create(string contentType, Type type = null)\n        {\n            return new ResponseTypeMetadata { ContentTypes = new[] { contentType }, Type = type };\n        }\n\n        public static ResponseTypeMetadata Create(int statusCode)\n        {\n            return new ResponseTypeMetadata { StatusCode = statusCode };\n        }\n    }\n\n    private sealed class SourceGeneratedRouteEndpointDataSource : EndpointDataSource\n    {\n        private readonly List<RouteEntry> _routeEntries = new();\n        private readonly IServiceProvider _applicationServices;\n\n        public SourceGeneratedRouteEndpointDataSource(IServiceProvider applicationServices)\n        {\n            _applicationServices = applicationServices;\n        }\n\n        public RouteHandlerBuilder AddRouteHandler(\n            RoutePattern pattern,\n            Delegate routeHandler,\n            IEnumerable<string> httpMethods,\n            bool isFallback,\n            MetadataPopulator metadataPopulator,\n            RequestDelegateFactoryFunc requestDelegateFactoryFunc)\n        {\n            var conventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();\n            var finallyConventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();\n\n            var routeAttributes = RouteAttributes.RouteHandler;\n            if (isFallback)\n            {\n                routeAttributes |= RouteAttributes.Fallback;\n            }\n\n            _routeEntries.Add(new()\n            {\n                RoutePattern = pattern,\n                RouteHandler = routeHandler,\n                HttpMethods = httpMethods,\n                RouteAttributes = routeAttributes,\n                Conventions = conventions,\n                FinallyConventions = finallyConventions,\n                RequestDelegateFactory = requestDelegateFactoryFunc,\n                MetadataPopulator = metadataPopulator,\n            });\n\n            return new RouteHandlerBuilder(new[] { new ConventionBuilder(conventions, finallyConventions) });\n        }\n\n        public override IReadOnlyList<RouteEndpoint> Endpoints\n        {\n            get\n            {\n                var endpoints = new RouteEndpoint[_routeEntries.Count];\n                for (int i = 0; i < _routeEntries.Count; i++)\n                {\n                    endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i]).Build();\n                }\n                return endpoints;\n            }\n        }\n\n        public override IReadOnlyList<RouteEndpoint> GetGroupedEndpoints(RouteGroupContext context)\n        {\n            var endpoints = new RouteEndpoint[_routeEntries.Count];\n            for (int i = 0; i < _routeEntries.Count; i++)\n            {\n                endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i], context.Prefix, context.Conventions, context.FinallyConventions).Build();\n            }\n            return endpoints;\n        }\n\n        public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;\n\n        private RouteEndpointBuilder CreateRouteEndpointBuilder(\n            RouteEntry entry, RoutePattern groupPrefix = null, IReadOnlyList<Action<EndpointBuilder>> groupConventions = null, IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions = null)\n        {\n            var pattern = RoutePatternFactory.Combine(groupPrefix, entry.RoutePattern);\n            var handler = entry.RouteHandler;\n            var isRouteHandler = (entry.RouteAttributes & RouteAttributes.RouteHandler) == RouteAttributes.RouteHandler;\n            var isFallback = (entry.RouteAttributes & RouteAttributes.Fallback) == RouteAttributes.Fallback;\n\n            var order = isFallback ? int.MaxValue : 0;\n            var displayName = pattern.RawText ?? pattern.ToString();\n\n            if (entry.HttpMethods is not null)\n            {\n                // Prepends the HTTP method to the DisplayName produced with pattern + method name\n                displayName = $\"HTTP: {string.Join(\", \", entry.HttpMethods)} {displayName}\";\n            }\n\n            if (isFallback)\n            {\n                displayName = $\"Fallback {displayName}\";\n            }\n\n            // If we're not a route handler, we started with a fully realized (although unfiltered) RequestDelegate, so we can just redirect to that\n            // while running any conventions. We'll put the original back if it remains unfiltered right before building the endpoint.\n            RequestDelegate factoryCreatedRequestDelegate = null;\n\n            // Let existing conventions capture and call into builder.RequestDelegate as long as they do so after it has been created.\n            RequestDelegate redirectRequestDelegate = context =>\n            {\n                if (factoryCreatedRequestDelegate is null)\n                {\n                    throw new InvalidOperationException(\"Resources.RouteEndpointDataSource_RequestDelegateCannotBeCalledBeforeBuild\");\n                }\n\n                return factoryCreatedRequestDelegate(context);\n            };\n\n            // Add MethodInfo and HttpMethodMetadata (if any) as first metadata items as they are intrinsic to the route much like\n            // the pattern or default display name. This gives visibility to conventions like WithOpenApi() to intrinsic route details\n            // (namely the MethodInfo) even when applied early as group conventions.\n            RouteEndpointBuilder builder = new(redirectRequestDelegate, pattern, order)\n            {\n                DisplayName = displayName,\n                ApplicationServices = _applicationServices,\n            };\n\n            if (isRouteHandler)\n            {\n                builder.Metadata.Add(handler.Method);\n            }\n\n            if (entry.HttpMethods is not null)\n            {\n                builder.Metadata.Add(new HttpMethodMetadata(entry.HttpMethods));\n            }\n\n            // Apply group conventions before entry-specific conventions added to the RouteHandlerBuilder.\n            if (groupConventions is not null)\n            {\n                foreach (var groupConvention in groupConventions)\n                {\n                    groupConvention(builder);\n                }\n            }\n\n            // Any metadata inferred directly inferred by RDF or indirectly inferred via IEndpoint(Parameter)MetadataProviders are\n            // considered less specific than method-level attributes and conventions but more specific than group conventions\n            // so inferred metadata gets added in between these. If group conventions need to override inferred metadata,\n            // they can do so via IEndpointConventionBuilder.Finally like the do to override any other entry-specific metadata.\n            if (isRouteHandler)\n            {\n                entry.MetadataPopulator(entry.RouteHandler, builder);\n            }\n\n            // Add delegate attributes as metadata before entry-specific conventions but after group conventions.\n            var attributes = handler.Method.GetCustomAttributes();\n            if (attributes is not null)\n            {\n                foreach (var attribute in attributes)\n                {\n                    builder.Metadata.Add(attribute);\n                }\n            }\n\n            entry.Conventions.IsReadOnly = true;\n            foreach (var entrySpecificConvention in entry.Conventions)\n            {\n                entrySpecificConvention(builder);\n            }\n\n            // If no convention has modified builder.RequestDelegate, we can use the RequestDelegate returned by the RequestDelegateFactory directly.\n            var conventionOverriddenRequestDelegate = ReferenceEquals(builder.RequestDelegate, redirectRequestDelegate) ? null : builder.RequestDelegate;\n\n            if (isRouteHandler || builder.FilterFactories.Count > 0)\n            {\n                factoryCreatedRequestDelegate = entry.RequestDelegateFactory(entry.RouteHandler, builder);\n            }\n\n            Debug.Assert(factoryCreatedRequestDelegate is not null);\n\n            // Use the overridden RequestDelegate if it exists. If the overridden RequestDelegate is merely wrapping the final RequestDelegate,\n            // it will still work because of the redirectRequestDelegate.\n            builder.RequestDelegate = conventionOverriddenRequestDelegate ?? factoryCreatedRequestDelegate;\n\n            entry.FinallyConventions.IsReadOnly = true;\n            foreach (var entryFinallyConvention in entry.FinallyConventions)\n            {\n                entryFinallyConvention(builder);\n            }\n\n            if (groupFinallyConventions is not null)\n            {\n                // Group conventions are ordered by the RouteGroupBuilder before\n                // being provided here.\n                foreach (var groupFinallyConvention in groupFinallyConventions)\n                {\n                    groupFinallyConvention(builder);\n                }\n            }\n\n            return builder;\n        }\n        private struct RouteEntry\n        {\n            public MetadataPopulator MetadataPopulator { get; init; }\n            public RequestDelegateFactoryFunc RequestDelegateFactory { get; init; }\n            public RoutePattern RoutePattern { get; init; }\n            public Delegate RouteHandler { get; init; }\n            public IEnumerable<string> HttpMethods { get; init; }\n            public RouteAttributes RouteAttributes { get; init; }\n            public ThrowOnAddAfterEndpointBuiltConventionCollection Conventions { get; init; }\n            public ThrowOnAddAfterEndpointBuiltConventionCollection FinallyConventions { get; init; }\n        }\n\n        [Flags]\n        private enum RouteAttributes\n        {\n            // The endpoint was defined by a RequestDelegate, RequestDelegateFactory.Create() should be skipped unless there are endpoint filters.\n            None = 0,\n            // This was added as Delegate route handler, so RequestDelegateFactory.Create() should always be called.\n            RouteHandler = 1,\n            // This was added by MapFallback.\n            Fallback = 2,\n        }\n\n        // This private class is only exposed to internal code via ICollection<Action<EndpointBuilder>> in RouteEndpointBuilder where only Add is called.\n        private sealed class ThrowOnAddAfterEndpointBuiltConventionCollection : List<Action<EndpointBuilder>>, ICollection<Action<EndpointBuilder>>\n        {\n            // We throw if someone tries to add conventions to the RouteEntry after endpoints have already been resolved meaning the conventions\n            // will not be observed given RouteEndpointDataSource is not meant to be dynamic and uses NullChangeToken.Singleton.\n            public bool IsReadOnly { get; set; }\n\n            void ICollection<Action<EndpointBuilder>>.Add(Action<EndpointBuilder> convention)\n            {\n                if (IsReadOnly)\n                {\n                    throw new InvalidOperationException(\"Resources.RouteEndpointDataSource_ConventionsCannotBeModifiedAfterBuild\");\n                }\n\n                Add(convention);\n            }\n        }\n\n        private class ConventionBuilder : IEndpointConventionBuilder\n        {\n            private readonly ICollection<Action<EndpointBuilder>> _conventions;\n            private readonly ICollection<Action<EndpointBuilder>> _finallyConventions;\n            public ConventionBuilder(ICollection<Action<EndpointBuilder>> conventions, ICollection<Action<EndpointBuilder>> finallyConventions)\n            {\n                _conventions = conventions;\n                _finallyConventions = finallyConventions;\n            }\n\n            /// <summary>\n            /// Adds the specified convention to the builder. Conventions are used to customize <see cref=\"EndpointBuilder\"/> instances.\n            /// </summary>\n            /// <param name=\"convention\">The convention to add to the builder.</param>\n            public void Add(Action<EndpointBuilder> convention)\n            {\n                _conventions.Add(convention);\n            }\n            public void Finally(Action<EndpointBuilder> finalConvention)\n            {\n                _finallyConventions.Add(finalConvention);\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "README.md",
    "content": "## Source generator for minimal APIs\n\nThis source generator should make your ASP.NET Core minimal API application trim and AOT friendly.\n\n## Using CI Builds\n\nTo use CI builds add the following nuget feed:\n\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <packageSources>\n        <clear />\n        <add key=\"ucontroller\" value=\"https://f.feedz.io/davidfowl/ucontroller/nuget/index.json\" />\n        <add key=\"NuGet.org\" value=\"https://api.nuget.org/v3/index.json\" />\n    </packageSources>\n</configuration>\n```\n\nSee the list of [versions](https://f.feedz.io/davidfowl/ucontroller/nuget/v3/packages/ucontroller/index.json)\n"
  },
  {
    "path": "nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <clear />\n    <add key=\"nuget\" value=\"https://api.nuget.org/v3/index.json\" />\n  </packageSources>\n</configuration>"
  },
  {
    "path": "samples/.vscode/launch.json",
    "content": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            // Use IntelliSense to find out which attributes exist for C# debugging\n            // Use hover for the description of the existing attributes\n            // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md\n            \"name\": \".NET Core Launch (web)\",\n            \"type\": \"coreclr\",\n            \"request\": \"launch\",\n            \"preLaunchTask\": \"build\",\n            // If you have changed target frameworks, make sure to update the program path.\n            \"program\": \"${workspaceFolder}/bin/Debug/net7.0/Sample.dll\",\n            \"args\": [],\n            \"cwd\": \"${workspaceFolder}\",\n            \"stopAtEntry\": false,\n            // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser\n            \"serverReadyAction\": {\n                \"action\": \"openExternally\",\n                \"pattern\": \"\\\\bNow listening on:\\\\s+(https?://\\\\S+)\"\n            },\n            \"env\": {\n                \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n            },\n            \"sourceFileMap\": {\n                \"/Views\": \"${workspaceFolder}/Views\"\n            }\n        },\n        {\n            \"name\": \".NET Core Attach\",\n            \"type\": \"coreclr\",\n            \"request\": \"attach\"\n        }\n    ]\n}"
  },
  {
    "path": "samples/.vscode/tasks.json",
    "content": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"build\",\n                \"${workspaceFolder}/Sample.csproj\",\n                \"/property:GenerateFullPaths=true\",\n                \"/consoleloggerparameters:NoSummary\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        },\n        {\n            \"label\": \"publish\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"publish\",\n                \"${workspaceFolder}/Sample.csproj\",\n                \"/property:GenerateFullPaths=true\",\n                \"/consoleloggerparameters:NoSummary\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        },\n        {\n            \"label\": \"watch\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"watch\",\n                \"run\",\n                \"--project\",\n                \"${workspaceFolder}/Sample.csproj\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        }\n    ]\n}"
  },
  {
    "path": "samples/MapTodos.cs",
    "content": "﻿// using Microsoft.EntityFrameworkCore;\n\npublic static class TodoEndpoints\n{\n    public static void MapTodoEndpoints(this IEndpointRouteBuilder routes)\n    {\n        var group = routes.MapGroup(\"/api/Todo\");\n        // group.WithOpenApi();\n        group.MapGet(\"/\", async (TodoDbContext db) =>\n        {\n            return await db.Todos.ToListAsync();\n        })\n        .WithTags(nameof(Todo))\n        .WithName(\"GetAllTodos\");\n        //.Produces<List<Todo>>(StatusCodes.Status200OK);\n\n        group.MapGet(\"/{id}\", async (int id, TodoDbContext db) =>\n        {\n            return await db.Todos.FindAsync(id)\n                is Todo model\n                    ? Results.Ok(model)\n                    : Results.NotFound();\n        })\n        .WithTags(nameof(Todo))\n        .WithName(\"GetTodoById\");\n        //.Produces<Todo>(StatusCodes.Status200OK)\n        //.Produces(StatusCodes.Status404NotFound);\n\n        group.MapPut(\"/{id}\", async (int id, Todo todo, TodoDbContext db) =>\n        {\n            var foundModel = await db.Todos.FindAsync(id);\n\n            if (foundModel is null)\n            {\n                return Results.NotFound();\n            }\n\n            db.Update(todo);\n            await db.SaveChangesAsync();\n\n            return Results.NoContent();\n        })\n        .WithTags(nameof(Todo))\n        .WithName(\"UpdateTodo\");\n        //.Produces(StatusCodes.Status404NotFound)\n        //.Produces(StatusCodes.Status204NoContent);\n\n        group.MapPost(\"/\", async (Todo todo, TodoDbContext db) =>\n        {\n            db.Todos.Add(todo);\n            await db.SaveChangesAsync();\n            return Results.Created($\"/api/Todo/{todo.Id}\", todo);\n        })\n        .WithTags(nameof(Todo))\n        .WithName(\"CreateTodo\");\n        //.Produces<Todo>(StatusCodes.Status201Created);\n\n        group.MapDelete(\"/{id}\", async (int id, TodoDbContext db) =>\n        {\n            if (await db.Todos.FindAsync(id) is Todo todo)\n            {\n                db.Todos.Remove(todo);\n                await db.SaveChangesAsync();\n                return Results.Ok(todo);\n            }\n\n            return Results.NotFound();\n        })\n        .WithTags(nameof(Todo))\n        .WithName(\"DeleteTodo\");\n        //.Produces<Todo>(StatusCodes.Status200OK)\n        // .Produces(StatusCodes.Status404NotFound);\n    }\n}\n\nclass Todo\n{\n    public int Id { get; set; }\n}\n\nclass TodoDbContext\n{\n    public DbSet<Todo> Todos { get; set; }\n    public Task SaveChangesAsync() => Task.CompletedTask;\n    public void Update(object o) { }\n}\n\nclass DbSet<T>\n{\n    public Task<List<T>> ToListAsync() { return null; }\n\n    public Task<T> FindAsync(object id) { return null; }\n    public void Remove(T item) { }\n    public void Add(T item) { }\n}"
  },
  {
    "path": "samples/Program.cs",
    "content": "﻿using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Primitives;\nusing MinimalApis.Extensions.Binding;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO.Pipelines;\nusing System.Reflection;\nusing System.Security.Claims;\nusing System.Text.Json.Nodes;\n\nvar builder = WebApplication.CreateBuilder();\n\nbuilder.Services.AddSingleton<ISayHello, EnglishHello>();\n\nvar app = builder.Build();\n\napp.MapGet(\"/\", () => \"Hello World\");\napp.MapGet(\"/hello/{name}\", (string name) => $\"Hello {name}\");\n\napp.MapGet(\"/anon\", () => new { Name = \"David\" });\n\napp.MapGet(\"/person\", () => new Person(\"David\"));\n\napp.MapGet(\"/ok\", (ClaimsPrincipal c, ISayHello hellosvc) => Results.Ok(hellosvc.Hello()));\n\napp.MapPost(\"/implictbody\", (JsonNode node) => node).AddEndpointFilter((context, next) => next(context));\napp.MapPost(\"/\", ([FromBody] JsonNode node) => node).AddEndpointFilter((context, next) => next(context));\n\napp.MapPost(\"/model\", (Model m) => m);\napp.MapPost(\"/model2\", (Model m) => { });\n\napp.MapPost(\"/fileupload\", (IFormFile file) =>\n{\n    return $\"Uploaded {file.Name}\";\n});\n\napp.MapGet(\"/nameofnot\", (string name) => name is null ? Results.NotFound() : Results.Ok($\"Hello {name}\"));\n\n\napp.MapPost(\"/formpost\", (IFormCollection formCollection) =>\n{\n    return $\"Uploaded {formCollection.Count} files\";\n});\n\napp.MapPost(\"/body\", (Body<string> body) => body.Value);\n\napp.MapPost(\"/validated\", (Validated<Model> model) =>\n{\n    if (!model.IsValid)\n    {\n        return Results.ValidationProblem(model.Errors);\n    }\n    return Results.Ok();\n});\n\napp.MapGet(\"/something\", object (CancellationToken ct) => new Person(\"Hello\"));\n\nIResult NoAccess(int? id) => Results.StatusCode(401);\n\napp.Map(\"/private\", NoAccess);\n\napp.MapPost(\"/post/q\", (Stream s) => Results.Stream(s));\napp.MapPost(\"/post/q\", (PipeReader r) => Results.Stream(r.AsStream()));\n\napp.MapPatch(\"/patch\", (HttpRequest req, HttpResponse resp) => Task.CompletedTask);\n\napp.MapGet(\"/multiple\", (StringValues queries) => queries.ToArray());\napp.MapGet(\"/multiple2\", (string[] queries) => queries);\napp.MapGet(\"/multiple3\", (int[] queries) => queries);\n\nvar api = app.MapGroup(\"/api\");\n\nvar personGroup = api.MapGroup(\"/persons\");\npersonGroup.MapGet(\"/\", () => new Person(\"David\"));\n\napi.MapTodoEndpoints();\n\nvar s = Wrapper.RoutePattern;\n\napp.MapGet(s, new Wrapper().Hello);\n\napp.MapGet(\"/another\", Wrapper.HelloDelegate);\napp.MapGet(\"/another1\", Wrapper.HelloDelegate2);\n\napp.MapGet(\"/choose/{c}\", (Choices c) => c.ToString());\n\nvar wrapper = new Wrapper();\nwrapper.AddRoutes(app);\n\nvar d = wrapper.Hello;\n\n// This can't be resolved\n// app.MapGet(\"/del\", d);\n\n// var path = \"/foo/{s}\";\n\nvar f = (string s) => \"hello\";\n\n// This neither\n// app.MapGet(path, f);\n\n// void Helper(string s, Func<string, string> handler) => app.MapGet(s, handler);\n\napp.Map(\"/test/map\", (int x) => x);\napp.Map(\"/test/map\", (int x, int y) => { });\napp.MapPut(\"/test/put\", (int x) => x);\napp.MapPut(\"/test/put\", (int x, int y) => { });\napp.MapPost(\"/test/post\", (int x) => x);\napp.MapPost(\"/test/post\", (int x, int y) => { });\napp.MapDelete(\"/test/delete\", (int x) => x);\napp.MapDelete(\"/test/delete\", (int x, int y) => { });\napp.MapPatch(\"/test/patch\", (int x) => x);\napp.MapPatch(\"/test/patch\", (int x, int y) => { });\napp.Map(\"/test/{n}\", (int n) => n);\n\n//void Foo([FromBody] JsonNode a1, [FromBody] JsonNode a2)\n//{\n\n//}\n\n//app.MapGet(\"/twobodies\", Foo);\n\nconst string pattern = \"/constpattern/{name}\";\n\napp.MapGet(pattern, (string name) => $\"Const pattern {name}\");\n\napp.MapGet(\"/something/parsable\", ([FromQuery] Parsable p) => p);\n\napp.MapGet(\"/lineinfo\", string (HttpContext context) =>\n{\n    var sourceKey = context.GetEndpoint()?.Metadata.GetMetadata<SourceKey>();\n    return sourceKey.ToString();\n});\n\napp.Run();\n\nrecord Person(string Name);\nrecord Product(string Name, decimal Price);\n\nstruct Parsable : IParsable<Parsable>\n{\n    public Parsable()\n    {\n\n    }\n\n    public static Parsable Parse(string s, IFormatProvider provider)\n    {\n        throw new NotImplementedException();\n    }\n\n    public static bool TryParse([NotNullWhen(true)] string s, IFormatProvider provider, [MaybeNullWhen(false)] out Parsable result)\n    {\n        throw new NotImplementedException();\n    }\n}\ninterface ISayHello\n{\n    string Hello();\n}\n\nclass EnglishHello : ISayHello\n{\n    public string Hello() => \"Hello\";\n}\n\npublic class Model\n{\n    public static ValueTask<Model> BindAsync(HttpContext context, ParameterInfo pi)\n    {\n        return ValueTask.FromResult(new Model());\n    }\n}\n\nenum Choices\n{\n    One,\n    Two,\n    Three,\n}"
  },
  {
    "path": "samples/Sample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"MinimalApis.Extensions\" Version=\"0.9.0-pre.20221011.36\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\uController.SourceGenerator\\uController.SourceGenerator.csproj\" OutputItemType=\"Analyzer\" ReferenceOutputAssembly=\"false\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "samples/Wrapper.cs",
    "content": "﻿class Wrapper\n{\n    public static readonly string RoutePattern = \"/foo/{id}\";\n\n    public static readonly Func<string, string> HelloDelegate = Hello2;\n\n    public static readonly Func<string, string> HelloDelegate2 = (name) => $\"Hello {name}\";\n\n    public static string Hello2(string name) => $\"Hello {name}\";\n\n    public string Hello(int id) => \"Hello World\";\n\n    public void AddRoutes(IEndpointRouteBuilder routes)\n    {\n        routes.MapGet(\"/hello2\", Hello);\n    }\n}\n"
  },
  {
    "path": "samples/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/AnalyzerReleases.Shipped.md",
    "content": "﻿; Shipped analyzer releases\n; https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md\n"
  },
  {
    "path": "src/uController.SourceGenerator/AnalyzerReleases.Unshipped.md",
    "content": "﻿; Unshipped analyzer release\n; https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md\n\n### New Rules\n\nRule ID | Category | Severity | Notes\n--------|----------|----------|--------------------\nMIN001  |  Usage   |  Error   | MIN001_uController\nMIN002  |  Usage   |  Error   | MIN002_uController\nMIN003  |  Usage   |  Error   | MIN003_uController\nMIN005  |  Usage   |  Error   | MIN005_uController\nMIN006  |  Usage   |  Error   | MIN006_uController\n\n"
  },
  {
    "path": "src/uController.SourceGenerator/AwaitableInfo.cs",
    "content": "﻿// Copyright (c) .NET Foundation. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n\nusing System;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\n\nnamespace Microsoft.Extensions.Internal\n{\n    internal readonly struct AwaitableInfo\n    {\n        public Type AwaiterType { get; }\n        public PropertyInfo AwaiterIsCompletedProperty { get; }\n        public MethodInfo AwaiterGetResultMethod { get; }\n        public MethodInfo AwaiterOnCompletedMethod { get; }\n        public MethodInfo AwaiterUnsafeOnCompletedMethod { get; }\n        public Type ResultType { get; }\n        public MethodInfo GetAwaiterMethod { get; }\n\n        public AwaitableInfo(\n            Type awaiterType,\n            PropertyInfo awaiterIsCompletedProperty,\n            MethodInfo awaiterGetResultMethod,\n            MethodInfo awaiterOnCompletedMethod,\n            MethodInfo awaiterUnsafeOnCompletedMethod,\n            Type resultType,\n            MethodInfo getAwaiterMethod)\n        {\n            AwaiterType = awaiterType;\n            AwaiterIsCompletedProperty = awaiterIsCompletedProperty;\n            AwaiterGetResultMethod = awaiterGetResultMethod;\n            AwaiterOnCompletedMethod = awaiterOnCompletedMethod;\n            AwaiterUnsafeOnCompletedMethod = awaiterUnsafeOnCompletedMethod;\n            ResultType = resultType;\n            GetAwaiterMethod = getAwaiterMethod;\n        }\n\n        public static bool IsTypeAwaitable(Type type, out AwaitableInfo awaitableInfo)\n        {\n            // Based on Roslyn code: http://source.roslyn.io/#Microsoft.CodeAnalysis.Workspaces/Shared/Extensions/ISymbolExtensions.cs,db4d48ba694b9347\n\n            // Awaitable must have method matching \"object GetAwaiter()\"\n            var getAwaiterMethod = type.GetMethods().FirstOrDefault(m =>\n                m.Name.Equals(\"GetAwaiter\", StringComparison.OrdinalIgnoreCase)\n                && m.GetParameters().Length == 0\n                && m.ReturnType != null);\n            if (getAwaiterMethod == null)\n            {\n                awaitableInfo = default(AwaitableInfo);\n                return false;\n            }\n\n            var awaiterType = getAwaiterMethod.ReturnType;\n\n            // Awaiter must have property matching \"bool IsCompleted { get; }\"\n            var isCompletedProperty = awaiterType.GetProperties().FirstOrDefault(p =>\n                p.Name.Equals(\"IsCompleted\", StringComparison.OrdinalIgnoreCase)\n                && p.PropertyType.Equals(typeof(bool))\n                && p.GetMethod != null);\n            if (isCompletedProperty == null)\n            {\n                awaitableInfo = default(AwaitableInfo);\n                return false;\n            }\n\n            // Awaiter must implement INotifyCompletion\n            var awaiterInterfaces = awaiterType.GetInterfaces();\n            var implementsINotifyCompletion = awaiterInterfaces.Any(t => t.Equals(typeof(INotifyCompletion)));\n            if (!implementsINotifyCompletion)\n            {\n                awaitableInfo = default(AwaitableInfo);\n                return false;\n            }\n\n            // INotifyCompletion supplies a method matching \"void OnCompleted(Action action)\"\n            //var iNotifyCompletionMap = awaiterType\n            //    .GetTypeInfo()\n            //    .DeclaredMethods\n            //    .GetRuntimeInterfaceMap(getType(typeof(INotifyCompletion)));\n            var onCompletedMethod = awaiterType.GetMethods().Single(m =>\n                m.Name.Equals(\"OnCompleted\", StringComparison.OrdinalIgnoreCase)\n                && m.ReturnType.Equals(typeof(void))\n                && m.GetParameters().Length == 1\n                && m.GetParameters()[0].ParameterType.Equals(typeof(Action)));\n\n            // Awaiter optionally implements ICriticalNotifyCompletion\n            var implementsICriticalNotifyCompletion = awaiterInterfaces.Any(t => t.Equals(typeof(ICriticalNotifyCompletion)));\n            MethodInfo unsafeOnCompletedMethod;\n            if (implementsICriticalNotifyCompletion)\n            {\n                // ICriticalNotifyCompletion supplies a method matching \"void UnsafeOnCompleted(Action action)\"\n                //var iCriticalNotifyCompletionMap = awaiterType\n                //    .GetTypeInfo()\n                //    .GetRuntimeInterfaceMap(typeof(ICriticalNotifyCompletion));\n                unsafeOnCompletedMethod = awaiterType.GetMethods().Single(m =>\n                    m.Name.Equals(\"UnsafeOnCompleted\", StringComparison.OrdinalIgnoreCase)\n                    && m.ReturnType.Equals(typeof(void))\n                    && m.GetParameters().Length == 1\n                    && m.GetParameters()[0].ParameterType.Equals(typeof(Action)));\n            }\n            else\n            {\n                unsafeOnCompletedMethod = null;\n            }\n\n            // Awaiter must have method matching \"void GetResult\" or \"T GetResult()\"\n            var getResultMethod = awaiterType.GetMethods().FirstOrDefault(m =>\n                m.Name.Equals(\"GetResult\")\n                && m.GetParameters().Length == 0);\n            if (getResultMethod == null)\n            {\n                awaitableInfo = default(AwaitableInfo);\n                return false;\n            }\n\n            awaitableInfo = new AwaitableInfo(\n                awaiterType,\n                isCompletedProperty,\n                getResultMethod,\n                onCompletedMethod,\n                unsafeOnCompletedMethod,\n                getResultMethod.ReturnType,\n                getAwaiterMethod);\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "src/uController.SourceGenerator/CodeGenerationTypes.cs",
    "content": "﻿// This class is a helper with the right type names\n\nnamespace Microsoft.AspNetCore.Http\n{\n    interface IResult { }\n    class HttpContext { }\n    class HttpRequest { }\n    class HttpResponse { }\n    interface IFormCollection { }\n    interface IFormFile { }\n    class AsParametersAttribute { }\n    class Results { }\n    class TypedResults { }\n}\n\nnamespace Microsoft.AspNetCore.Http.Metadata\n{\n\n    interface IEndpointMetadataProvider { }\n\n    interface IEndpointParameterMetadataProvider { }\n\n    interface IFromServiceMetadata { }\n    interface IFromQueryMetadata { }\n    interface IFromRouteMetadata { }\n    interface IFromBodyMetadata\n    {\n        public bool AllowEmpty { get; }\n    }\n    interface IFromFormMetadata { }\n    interface IFromHeaderMetadata { }\n}\n\nnamespace Microsoft.Extensions.Primitives\n{\n    struct StringValues { }\n}\n\nnamespace System.IO.Pipelines\n{\n    class PipeReader { }\n}\n\nnamespace Microsoft.AspNetCore.Routing\n{\n    interface IEndpointRouteBuilder { }\n}"
  },
  {
    "path": "src/uController.SourceGenerator/HttpModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\nusing uController.SourceGenerator;\n\nnamespace uController\n{\n    class MethodModel\n    {\n        public string UniqueName { get; set; }\n        public MethodInfo MethodInfo { get; set; }\n        public List<ParameterModel> Parameters { get; } = new List<ParameterModel>();\n        public List<object> Metadata { get; } = new List<object>();\n        public RoutePattern RoutePattern { get; set; }\n        public bool DisableInferBodyFromParameters { get; set; }\n    }\n\n    class ParameterModel\n    {\n        public MethodModel Method { get; set; }\n        public IParameterSymbol ParameterSymbol { get; set; }\n        public ParameterInfo ParameterInfo { get; set; }\n        public string Name { get; set; }\n        public string GeneratedName { get; set; }\n        public Type ParameterType { get; set; }\n        public string FromQuery { get; set; }\n        public string FromHeader { get; set; }\n        public string FromForm { get; set; }\n        public string FromRoute { get; set; }\n        public CustomAttributeData FromBodyAttributeData { get; set; }\n        public bool FromBody => FromBodyAttributeData != null;\n        public bool FromServices { get; set; }\n        public int Index { get; set; }\n\n        public bool HasBindingSource => FromBody || FromServices || \n            FromForm != null || FromQuery != null || FromHeader != null || FromRoute != null;\n\n        public bool Unresovled { get; set; }\n\n        public bool QueryOrRoute { get; set; }\n        public bool BodyOrService { get; set; }\n        public bool RequiresParameterInfo { get; set; }\n        public bool ReadFromForm { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/MinimalCodeGenerator.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Pipelines;\nusing System.Linq;\nusing System.Reflection;\nusing System.Security.Claims;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.Extensions.Internal;\nusing Microsoft.Extensions.Primitives;\nusing Roslyn.Reflection;\n\nnamespace uController.SourceGenerator\n{\n    class MinimalCodeGenerator\n    {\n        private readonly StringBuilder _codeBuilder = new();\n        private readonly WellKnownTypes _wellKnownTypes;\n        private int _indent;\n\n        public MinimalCodeGenerator(WellKnownTypes wellKnownTypes)\n        {\n            _wellKnownTypes = wellKnownTypes;\n        }\n\n        public HashSet<ParameterModel> BodyParameters { get; set; } = new HashSet<ParameterModel>();\n\n        private Type Unwrap(Type type)\n        {\n            if (type.IsGenericType && !type.IsGenericTypeDefinition)\n            {\n                // instantiated generic type only\n                Type genericType = type.GetGenericTypeDefinition();\n                if (genericType.Equals(typeof(Nullable<>)))\n                {\n                    return type.GetGenericArguments()[0];\n                }\n            }\n\n            return null;\n        }\n\n        internal static Type UnwrapValueTask(Type type)\n        {\n            if (type.IsGenericType && !type.IsGenericTypeDefinition)\n            {\n                // instantiated generic type only\n                var genericType = type.GetGenericTypeDefinition();\n                if (genericType.Equals(typeof(ValueTask<>)))\n                {\n                    return type.GetGenericArguments()[0];\n                }\n            }\n\n            return null;\n        }\n\n        public void Indent()\n        {\n            _indent++;\n        }\n\n        public void Unindent()\n        {\n            _indent--;\n        }\n\n        public void Generate(MethodModel method)\n        {\n            GenerateMethod(method);\n            WriteLine(\"\");\n            GenerateFilteredMethod(method);\n        }\n\n        private void GenerateMethod(MethodModel method)\n        {\n            var methodStartIndex = _codeBuilder.Length + 4 * _indent;\n            WriteLine($\"async {typeof(Task)} {method.UniqueName}({typeof(HttpContext)} httpContext)\");\n            WriteLine(\"{\");\n            Indent();\n\n            // Declare locals\n            var hasAwait = false;\n            var hasFromBody = false;\n            var hasFromForm = false;\n            var generatedParamCheck = false;\n\n            var paramFailureStartIndex = _codeBuilder.Length + 4 * _indent;\n            var paramCheckExpression = \"var wasParamCheckFailure = false;\";\n\n            WriteLine(paramCheckExpression);\n\n            foreach (var parameter in method.Parameters)\n            {\n                var parameterName = parameter.GeneratedName;\n                EmitParameter(ref hasAwait, ref hasFromBody, ref hasFromForm, ref generatedParamCheck, parameter, parameterName);\n            }\n\n            var resultExpression = \"\";\n\n            AwaitableInfo awaitableInfo = default;\n            if (method.MethodInfo.ReturnType.Equals(typeof(void)))\n            {\n                resultExpression = \"\";\n            }\n            else\n            {\n                if (AwaitableInfo.IsTypeAwaitable(method.MethodInfo.ReturnType, out awaitableInfo))\n                {\n                    if (awaitableInfo.ResultType.Equals(typeof(void)))\n                    {\n                        if (hasAwait)\n                        {\n                            resultExpression = \"await \";\n                        }\n                        else\n                        {\n                            resultExpression = \"return \";\n                        }\n                    }\n                    else\n                    {\n                        resultExpression = \"var result = await \";\n                        hasAwait = true;\n                    }\n                }\n                else\n                {\n                    resultExpression = \"var result = \";\n                }\n            }\n\n            if (generatedParamCheck)\n            {\n                WriteLine(\"if (wasParamCheckFailure)\");\n                WriteLine(\"{\");\n                Indent();\n                WriteLine(\"httpContext.Response.StatusCode = 400;\");\n                if (hasAwait)\n                {\n                    WriteLine(\"return;\");\n                }\n                else\n                {\n                    WriteLine(\"return Task.CompletedTask;\");\n                }\n\n                Unindent();\n                WriteLine(\"}\");\n            }\n            else\n            {\n                var currentIndent = 4 * _indent;\n                _codeBuilder.Remove(paramFailureStartIndex - currentIndent - Environment.NewLine.Length, paramCheckExpression.Length + currentIndent + Environment.NewLine.Length);\n            }\n\n            Write(resultExpression);\n\n            WriteNoIndent($\"handler(\");\n            bool first = true;\n            foreach (var parameter in method.Parameters)\n            {\n                var parameterName = parameter.GeneratedName;\n                if (!first)\n                {\n                    WriteNoIndent(\", \");\n                }\n                WriteNoIndent(parameterName);\n                first = false;\n            }\n\n            if (!hasAwait && method.MethodInfo.ReturnType.Equals(typeof(ValueTask)))\n            {\n                // Convert the ValueTask to a Task\n                WriteLineNoIndent(\").AsTask();\");\n            }\n            else\n            {\n                WriteLineNoIndent(\");\");\n            }\n\n            if (!hasAwait)\n            {\n                // Remove \" async \" from method signature.\n                _codeBuilder.Remove(methodStartIndex, 6);\n            }\n\n            void AwaitOrReturn(string executeAsync)\n            {\n                if (hasAwait)\n                {\n                    Write(\"await \");\n                }\n                else\n                {\n                    Write(\"return \");\n                }\n\n                WriteLineNoIndent(executeAsync);\n            }\n\n            var unwrappedType = awaitableInfo.ResultType ?? method.MethodInfo.ReturnType;\n            if (_wellKnownTypes.IResultType.IsAssignableFrom(unwrappedType))\n            {\n                AwaitOrReturn(\"result.ExecuteAsync(httpContext);\");\n            }\n            else if (unwrappedType.Equals(typeof(string)))\n            {\n                AwaitOrReturn($\"httpContext.Response.WriteAsync(result);\");\n            }\n            else if (unwrappedType.Equals(typeof(object)))\n            {\n                AwaitOrReturn(\"ExecuteObjectResult(result, httpContext);\");\n            }\n            else if (!unwrappedType.Equals(typeof(void)))\n            {\n                AwaitOrReturn($\"httpContext.Response.WriteAsJsonAsync(result);\");\n            }\n            else if (!hasAwait && method.MethodInfo.ReturnType.Equals(typeof(void)))\n            {\n                // If awaitableInfo.ResultType is void, we've already returned the awaitable directly.\n                WriteLine($\"return {typeof(Task)}.CompletedTask;\");\n            }\n\n            Unindent();\n            WriteLine(\"}\");\n        }\n\n        private void GenerateFilteredMethod(MethodModel method)\n        {\n            WriteLine($\"async {typeof(Task)} {method.UniqueName}Filtered({typeof(HttpContext)} httpContext)\");\n            WriteLine(\"{\");\n            Indent();\n\n            // Declare locals\n            var hasAwait = false;\n            var hasFromBody = false;\n            var hasFromForm = false;\n            var generatedParamCheck = false;\n\n            var paramFailureStartIndex = _codeBuilder.Length + 4 * _indent;\n            var paramCheckExpression = \"var wasParamCheckFailure = false;\";\n\n            WriteLine(paramCheckExpression);\n\n            foreach (var parameter in method.Parameters)\n            {\n                var parameterName = parameter.GeneratedName;\n                EmitParameter(ref hasAwait, ref hasFromBody, ref hasFromForm, ref generatedParamCheck, parameter, parameterName);\n            }\n\n            if (generatedParamCheck)\n            {\n                WriteLine(\"if (wasParamCheckFailure)\");\n                WriteLine(\"{\");\n                Indent();\n                WriteLine(\"httpContext.Response.StatusCode = 400;\");\n                Unindent();\n                WriteLine(\"}\");\n            }\n            else\n            {\n                var currentIndent = 4 * _indent;\n                _codeBuilder.Remove(paramFailureStartIndex - currentIndent - Environment.NewLine.Length, paramCheckExpression.Length + currentIndent + Environment.NewLine.Length);\n            }\n\n            Write(\"var result = await \");\n\n            WriteNoIndent($\"filteredInvocation(new DefaultEndpointFilterInvocationContext(httpContext\");\n            foreach (var parameter in method.Parameters)\n            {\n                WriteNoIndent(\", \");\n                WriteNoIndent(parameter.GeneratedName);\n            }\n            WriteLineNoIndent(\"));\");\n\n            void AwaitOrReturn(string executeAsync)\n            {\n                Write(\"await \");\n\n                WriteLineNoIndent(executeAsync);\n            }\n\n            AwaitOrReturn(\"ExecuteObjectResult(result, httpContext);\");\n\n            Unindent();\n            WriteLine(\"}\");\n        }\n\n        private void EmitParameter(ref bool hasAwait, ref bool hasFromBody, ref bool hasForm, ref bool generatedParamCheck, ParameterModel parameter, string parameterName)\n        {\n            var defaultValue = parameter.ParameterSymbol.HasExplicitDefaultValue\n                ? parameter.ParameterSymbol.ExplicitDefaultValue\n                : null;\n            var isOptional = parameter.ParameterSymbol.IsOptional ||\n                             parameter.ParameterSymbol.NullableAnnotation == NullableAnnotation.Annotated;\n            if (parameter.ParameterType.Equals(typeof(HttpContext)))\n            {\n                WriteLine($\"var {parameterName} = httpContext;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(HttpRequest)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.Request;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(HttpResponse)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.Response;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(IFormFile)))\n            {\n                if (!hasForm)\n                {\n                    WriteLine($\"var formCollection = await httpContext.Request.ReadFormAsync();\");\n                    hasAwait = true;\n                    hasForm = true;\n                }\n\n                WriteLine($@\"var {parameterName} = formCollection.Files[\"\"{parameter.Name}\"\"];\");\n                parameter.ReadFromForm = true;\n            }\n            else if (parameter.ParameterType.Equals(typeof(IFormCollection)))\n            {\n                if (!hasForm)\n                {\n                    WriteLine($\"var formCollection = await httpContext.Request.ReadFormAsync();\");\n                    hasAwait = true;\n                    hasForm = true;\n                }\n\n                WriteLine($\"var {parameterName} = formCollection;\");\n                parameter.ReadFromForm = true;\n            }\n            else if (parameter.ParameterType.Equals(typeof(ClaimsPrincipal)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.User;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(CancellationToken)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.RequestAborted;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(Stream)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.Request.Body;\");\n            }\n            else if (parameter.ParameterType.Equals(typeof(PipeReader)))\n            {\n                WriteLine($\"var {parameterName} = httpContext.Request.BodyReader;\");\n            }\n            else if (parameter.FromRoute != null)\n            {\n                if (!GenerateConvert(parameterName, parameter.ParameterInfo, parameter.ParameterType, defaultValue, parameter.FromRoute, \"httpContext.Request.RouteValues\", ref generatedParamCheck, nullable: true))\n                {\n                    parameter.Unresovled = true;\n                }\n            }\n            else if (parameter.FromQuery != null)\n            {\n                if (!GenerateConvert(parameterName, parameter.ParameterInfo, parameter.ParameterType, defaultValue, parameter.FromQuery, \"httpContext.Request.Query\", ref generatedParamCheck, sourcedFromStringValue: true))\n                {\n                    parameter.Unresovled = true;\n                }\n            }\n            else if (parameter.FromHeader != null)\n            {\n                if (!GenerateConvert(parameterName, parameter.ParameterInfo, parameter.ParameterType, defaultValue, parameter.FromHeader, \"httpContext.Request.Headers\", ref generatedParamCheck, sourcedFromStringValue: true))\n                {\n                    parameter.Unresovled = true;\n                }\n            }\n            else if (parameter.FromServices)\n            {\n                if (isOptional)\n                {\n                    WriteLine($\"var {parameterName} = httpContext.RequestServices.GetService<{parameter.ParameterType}>();\");\n                }\n                else\n                {\n                    WriteLine($\"var {parameterName} = httpContext.RequestServices.GetRequiredService<{parameter.ParameterType}>();\");\n                }\n            }\n            else if (parameter.FromForm != null)\n            {\n                if (!hasForm)\n                {\n                    WriteLine($\"var formCollection = await httpContext.Request.ReadFormAsync();\");\n                    hasAwait = true;\n                    hasForm = true;\n                }\n\n                if (!GenerateConvert(parameterName, parameter.ParameterInfo, parameter.ParameterType, defaultValue, parameter.FromForm, \"formCollection\", ref generatedParamCheck))\n                {\n                    parameter.Unresovled = true;\n                }\n\n                parameter.ReadFromForm = true;\n            }\n            else if (parameter.FromBody)\n            {\n                BodyParameters.Add(parameter);\n                var allowEmptyKey = \"AllowEmpty\";\n                // Check existence of argument beforehand to avoid null-ref\n                if (parameter.FromBodyAttributeData is {} fromBodyAttribute &&\n                    fromBodyAttribute.NamedArguments.Any(n => n.MemberName == allowEmptyKey))\n                {\n                    var allowEmpty = fromBodyAttribute?.GetNamedArgument<bool>(allowEmptyKey) ?? false;\n                    isOptional |= allowEmpty;\n                }\n\n                if (parameter.ParameterType.Equals(typeof(PipeReader)))\n                {\n                    WriteLine($\"var {parameterName} = httpContext.Request.BodyReader;\");\n                }\n                else if (parameter.ParameterType.Equals(typeof(Stream)))\n                {\n                    WriteLine($\"var {parameterName} = httpContext.Request.Body;\");\n                }\n                else\n                {\n                    WriteLine($\"var {parameterName} = await ResolveBody<{parameter.ParameterType}>(httpContext, {(isOptional ? \"true\" : \"false\")});\");\n                }\n\n                hasAwait = true;\n            }\n            else\n            {\n                // Error if we can't determine the binding source for this parameter\n                var parameterType = Unwrap(parameter.ParameterType) ?? parameter.ParameterType;\n\n                if (HasBindAsync(parameterType, out var bindAsyncMethod, out var parameterCount, out var returnType))\n                {\n                    if (parameterCount == 1)\n                    {\n                        WriteLine($\"var {parameterName}Nullable = await {bindAsyncMethod.DeclaringType}.BindAsync(httpContext);\");\n                    }\n                    else\n                    {\n                        parameter.RequiresParameterInfo = true;\n\n                        WriteLine($\"var {parameterName}Nullable = await {bindAsyncMethod.DeclaringType}.BindAsync(httpContext, {parameter.GeneratedName}ParameterInfo);\");\n                    }\n\n                    var generatedBindAsyncAssignment = false;\n\n                    // Emit null check when the parameter is required\n                    // but the `BindAsync` can resolve to a nullable value\n                    if (UnwrapValueTask(returnType) is RoslynType innerReturn // Gets the T in ValueTask<T>\n                        && parameter.ParameterSymbol.NullableAnnotation != NullableAnnotation.Annotated\n                        && innerReturn.TypeSymbol.NullableAnnotation == NullableAnnotation.Annotated) // Gets the T in T?\n                    {\n                        WriteLine($\"if ({parameterName}Nullable == null)\");\n                        WriteLine(\"{\");\n                        Indent();\n                        WriteLine(\"httpContext.Response.StatusCode = 400;\");\n                        WriteLine(\"return;\");\n                        Unindent();\n                        WriteLine(\"}\");\n\n                        // If the result of `BindAsync` is nullable and the parameter\n                        // is not a value type then emit the value of the resolved\n                        // nullable value\n                        if (innerReturn.TypeSymbol.IsValueType)\n                        {\n                            WriteLine($\"var {parameterName} = {parameterName}Nullable.Value;\");\n                            generatedBindAsyncAssignment = true;\n                        }\n                    }\n\n                    // Get the default out of the parameter\n                    if (!generatedBindAsyncAssignment)\n                    {\n                        WriteLine($\"var {parameterName} = {parameterName}Nullable;\");\n                    }\n\n\n                    hasAwait = true;\n                }\n\n                else if (HasTryParseMethod(parameterType, out var tryParseMethod) ||\n                         parameterType.Equals(typeof(string)) ||\n                         parameterType.Equals(typeof(StringValues)) ||\n                         parameterType.Equals(typeof(string[])) ||\n                         parameterType.IsArray &&\n                         HasTryParseMethod(parameterType.GetElementType(), out tryParseMethod))\n                {\n                    parameter.QueryOrRoute = true;\n\n                    // Fallback to resolver\n                    if (!GenerateConvert(parameterName, parameter.ParameterInfo, parameter.ParameterType, defaultValue, parameter.Name, $\"{parameter.GeneratedName}RouteOrQueryResolver\", ref generatedParamCheck, methodCall: true, tryParseMethod: tryParseMethod, sourcedFromStringValue: true))\n                    {\n                        parameter.Unresovled = true;\n                    }\n                }\n                else\n                {\n                    parameter.BodyOrService = true;\n                    hasAwait = true;\n\n                    WriteLine($\"var {parameterName} = await {parameterName}ServiceOrBodyResolver(httpContext);\");\n                }\n            }\n        }\n\n        private bool HasTryParseMethod(Type type, out MethodInfo mi)\n        {\n            // TODO: Handle specific types (Uri, DateTime etc) with relevant options\n\n            mi = null;\n\n            if (type.IsEnum)\n            {\n                // Use Enum.TryParse<T>(string, bool, out T) for enums\n                mi = GetEnumTryParseMethod();\n            }\n\n            mi ??= GetStaticMethodFromHierarchy(type, \"TryParse\", new[] { typeof(string), type.MakeByRefType() }, m => m.ReturnType.Equals(typeof(bool)));\n\n            mi ??= GetStaticMethodFromHierarchy(type, \"TryParse\", new[] { typeof(string), _wellKnownTypes.IFormatProviderType, type.MakeByRefType() }, m => m.ReturnType.Equals(typeof(bool)));\n\n            return mi != null;\n        }\n\n        private bool HasBindAsync(Type type, out MethodInfo mi, out int parameterCount, out Type returnType)\n        {\n            mi = GetStaticMethodFromHierarchy(type, \"BindAsync\", new[] { _wellKnownTypes.HttpContextType }, m => true);\n\n            mi ??= GetStaticMethodFromHierarchy(type, \"BindAsync\", new[] { _wellKnownTypes.HttpContextType, _wellKnownTypes.ParamterInfoType }, m => true);\n\n            parameterCount = mi?.GetParameters().Length ?? 0;\n\n            returnType = mi?.ReturnType;\n\n            return mi != null;\n        }\n\n        private bool GenerateConvert(string sourceName, ParameterInfo parameterInfo, Type type, object defaultValue, string key, string sourceExpression, ref bool generatedParamCheck, bool nullable = false, bool methodCall = false, MethodInfo tryParseMethod = null, bool sourcedFromStringValue = false)\n        {\n            var getter = methodCall\n                ? $@\"{sourceExpression}(httpContext, \"\"{key}\"\")\"\n                : $@\"{sourceExpression}[\"\"{key}\"\"]\";\n\n            WriteLine($\"var getter{sourceName}Value = {getter};\");\n\n            if (!(parameterInfo as RoslynParameterInfo).IsOptional)\n            {\n                generatedParamCheck = true;\n                if (sourcedFromStringValue)\n                {\n                    WriteLine($\"if (string.IsNullOrEmpty(getter{sourceName}Value))\");\n                }\n                else\n                {\n                    WriteLine($\"if (getter{sourceName}Value == null)\");\n                }\n\n                WriteLine(\"{\");\n                Indent();\n                WriteLine(\"wasParamCheckFailure = true;\");\n                Unindent();\n                WriteLine(\"}\");\n            }\n\n            if (type.Equals(typeof(string)))\n            {\n                if (defaultValue is null)\n                {\n                    WriteLine($\"var {sourceName} = getter{sourceName}Value\" + (nullable ? \"?.ToString();\" : \".ToString();\"));\n                }\n                else\n                {\n                    if (nullable)\n                    {\n                        WriteLine($@\"var {sourceName} = getter{sourceName}Value?.ToString() ?? \"\"{defaultValue}\"\";\");\n                    }\n                    else\n                    {\n                        WriteLine($@\"var {sourceName}Str = getter{sourceName}Value.ToString();\");\n                        WriteLine($@\"var {sourceName} = string.IsNullOrEmpty({sourceName}Str) ? \"\"{defaultValue}\"\" : {sourceName}Str;\");\n                    }\n                }\n            }\n            else if (type.Equals(typeof(StringValues)))\n            {\n                WriteLine($\"var {sourceName} = getter{sourceName}Value.Value;\");\n            }\n            else if (type.Equals(typeof(StringValues?)))\n            {\n                WriteLine($\"var {sourceName} = getter{sourceName}Value;\");\n            }\n            else if (type.Equals(typeof(string[])))\n            {\n                WriteLine($\"var {sourceName} = getter{sourceName}Value?.ToArray();\");\n            }\n            else\n            {\n                var unwrappedType = Unwrap(type) ?? type;\n\n                if (tryParseMethod is null)\n                {\n                    if (!HasTryParseMethod(unwrappedType, out tryParseMethod))\n                    {\n                        WriteLine($\"{type} {sourceName} = default;\");\n                        return false;\n                    }\n                }\n\n                if (type.IsArray)\n                {\n                    var elementType = type.GetElementType();\n                    WriteLine($\"var {sourceName}_Value = getter{sourceName}Value?.ToArray();\");\n                    WriteLine($\"{elementType}[] {sourceName} = default;\");\n                    WriteLine($\"for (var i = 0; i < {sourceName}.Length; i++)\");\n                    WriteLine(\"{\");\n                    Indent();\n                    WriteLine($\"{sourceName} ??= new {elementType}[{sourceName}_Value.Length];\");\n                    GenerateTryParse(tryParseMethod, $\"{sourceName}_Value[i]\", $\"{sourceName}[i]\", elementType, null,\n                                     ref generatedParamCheck);\n                    Unindent();\n                    WriteLine(\"}\");\n\n                    // TODO: Nullability\n                    WriteLine($\"{sourceName} ??= System.Array.Empty<{elementType}>();\");\n                }\n                else\n                {\n                    WriteLine($\"var {sourceName}_Value = getter{sourceName}Value\" + (nullable ? \"?.ToString();\" : \".ToString();\"));\n                    WriteLine($\"{type} {sourceName};\");\n\n                    GenerateTryParse(tryParseMethod, $\"{sourceName}_Value\", sourceName, type, defaultValue,\n                                     ref generatedParamCheck);\n                }\n            }\n\n            return true;\n        }\n\n        private void GenerateTryParse(MethodInfo tryParseMethod, string sourceName, string outputName, Type type, object defaultValue, ref bool generatedParamCheck)\n        {\n            var underlyingType = Unwrap(type);\n\n            // Support different TryParse overloads\n            string TryParseExpression(string outputExpression) => (tryParseMethod.DeclaringType, tryParseMethod.GetParameters().Length) switch\n            {\n                (_, 2) => $\"{tryParseMethod.DeclaringType}.TryParse({sourceName}, out {outputExpression})\",\n                (var type, 3) when type.Equals(_wellKnownTypes.EnumType) => $\"{tryParseMethod.DeclaringType}.TryParse({sourceName}, true, out {outputExpression})\",\n                (_, 3) => $\"{tryParseMethod.DeclaringType}.TryParse({sourceName}, System.Globalization.CultureInfo.InvariantCulture, out {outputExpression})\",\n                _ => throw new NotSupportedException(\"Unknown TryParse method\")\n            };\n\n            // Type isn't nullable\n            if (underlyingType is null)\n            {\n                generatedParamCheck = true;\n\n                // No source, no default value\n                // No source but has a default value\n                // Unable to parse\n                if (defaultValue is null)\n                {\n                    WriteLine($\"if ({sourceName} == null || !{TryParseExpression(outputName)})\");\n                    WriteLine(\"{\");\n                    Indent();\n                    WriteLine($\"{outputName} = default;\");\n                    WriteLine(\"wasParamCheckFailure = true;\");\n                    Unindent();\n                    WriteLine(\"}\");\n                }\n                else\n                {\n                    WriteLine($\"if (string.IsNullOrEmpty({sourceName}))\");\n                    WriteLine(\"{\");\n                    Indent();\n                    WriteLine($\"{outputName} = {defaultValue};\");\n                    Unindent();\n                    WriteLine(\"}\");\n                    WriteLine($\"else if (!{TryParseExpression(outputName)})\");\n                    WriteLine(\"{\");\n                    Indent();\n                    WriteLine($\"{outputName} = default;\");\n                    WriteLine(\"wasParamCheckFailure = true;\");\n                    Unindent();\n                    WriteLine(\"}\");\n                }\n            }\n            else\n            {\n                WriteLine($\"if ({sourceName} != null && {TryParseExpression($\"var {outputName}_Temp\")})\");\n                WriteLine(\"{\");\n                Indent();\n                WriteLine($\"{outputName} = {outputName}_Temp;\");\n                Unindent();\n                WriteLine(\"}\");\n                WriteLine(\"else\");\n                WriteLine(\"{\");\n                Indent();\n                if (defaultValue is null)\n                {\n                    WriteLine($\"{outputName} = default;\");\n                }\n                else\n                {\n                    WriteLine($\"{outputName} = {defaultValue};\");\n                }\n                Unindent();\n                WriteLine(\"}\");\n            }\n        }\n\n        private MethodInfo GetEnumTryParseMethod()\n        {\n            var tryParse = (from m in _wellKnownTypes.EnumType.GetMethods(BindingFlags.Public | BindingFlags.Static)\n                            let parameters = m.GetParameters()\n                            where parameters.Length == 3 && m.Name == \"TryParse\" && m.IsGenericMethod &&\n                                  parameters[0].ParameterType.Equals(typeof(string)) &&\n                                  parameters[1].ParameterType.Equals(typeof(bool))\n                            select m).FirstOrDefault();\n            return tryParse;\n        }\n\n        private MethodInfo GetStaticMethodFromHierarchy(Type type, string name, Type[] parameterTypes, Func<MethodInfo, bool> validateReturnType)\n        {\n            bool IsMatch(MethodInfo method) => method is not null && !method.IsAbstract && validateReturnType(method);\n\n            var methodInfo = type.GetMethod(name,\n                                            BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy,\n                                            binder: null,\n                                            types: parameterTypes,\n                                            modifiers: default);\n\n            if (IsMatch(methodInfo))\n            {\n                return methodInfo;\n            }\n\n            var candidateInterfaceMethodInfo = default(MethodInfo);\n\n            // Check all interfaces for implementations. Fail if there are duplicates.\n            foreach (var implementedInterface in type.GetInterfaces())\n            {\n                var interfaceMethod = implementedInterface.GetMethod(name,\n                    BindingFlags.Public | BindingFlags.Static,\n                    binder: null,\n                    types: parameterTypes,\n                    modifiers: default);\n\n                if (IsMatch(interfaceMethod))\n                {\n                    if (candidateInterfaceMethodInfo is not null)\n                    {\n                        return null;\n                    }\n\n                    candidateInterfaceMethodInfo = interfaceMethod;\n                }\n            }\n\n            return candidateInterfaceMethodInfo;\n        }\n\n        private void WriteLineNoIndent(string value)\n        {\n            _codeBuilder.AppendLine(value);\n        }\n\n        private void WriteNoIndent(string value)\n        {\n            _codeBuilder.Append(value);\n        }\n\n        private void Write(string value)\n        {\n            if (_indent > 0)\n            {\n                _codeBuilder.Append(new string(' ', _indent * 4));\n            }\n            _codeBuilder.Append(value);\n        }\n\n        private void WriteLine(string value)\n        {\n            if (_indent > 0)\n            {\n                _codeBuilder.Append(new string(' ', _indent * 4));\n            }\n            _codeBuilder.AppendLine(value);\n        }\n\n        public override string ToString()\n        {\n            return _codeBuilder.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/MetadataLoadContext.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Linq;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    public class MetadataLoadContext\n    {\n        private readonly Compilation _compilation;\n        private readonly ConcurrentDictionary<ISymbol, object> _cache = new(SymbolEqualityComparer.IncludeNullability);\n\n        public MetadataLoadContext(Compilation compilation)\n        {\n            _compilation = compilation;\n        }\n\n        public Assembly Assembly => _compilation.Assembly.AsAssembly(this);\n\n        internal Compilation Compilation => _compilation;\n\n        public Type ResolveType(string fullyQualifiedMetadataName)\n        {\n            return _compilation.GetTypeByMetadataName(fullyQualifiedMetadataName)?.AsType(this);\n        }\n\n        public Type ResolveType<T>() => ResolveType(typeof(T));\n\n        public Type ResolveType(Type type)\n        {\n            if (type is RoslynType)\n            {\n                return type;\n            }\n\n            var resolvedType = _compilation.GetTypeByMetadataName(type.FullName);\n\n            if (resolvedType is not null)\n            {\n                return resolvedType.AsType(this);\n            }\n\n            if (type.IsArray)\n            {\n                var typeSymbol = _compilation.GetTypeByMetadataName(type.GetElementType().FullName);\n                if (typeSymbol is null)\n                {\n                    return null;\n                }\n\n                return _compilation.CreateArrayTypeSymbol(typeSymbol).AsType(this);\n            }\n\n            if (type.IsGenericType)\n            {\n                var openGenericTypeSymbol = _compilation.GetTypeByMetadataName(type.GetGenericTypeDefinition().FullName);\n                if (openGenericTypeSymbol is null)\n                {\n                    return null;\n                }\n\n                return openGenericTypeSymbol.AsType(this).MakeGenericType(type.GetGenericArguments());\n            }\n\n            return null;\n        }\n\n        public TMember GetOrCreate<TMember>(ISymbol symbol) where TMember : class\n        {\n            if (symbol is null)\n            {\n                return null;\n            }\n\n            return (TMember)_cache.GetOrAdd(symbol, s => s switch\n            {\n                ITypeSymbol t => new RoslynType(t, this),\n                IFieldSymbol f => new RoslynFieldInfo(f, this),\n                IPropertySymbol p => new RoslynPropertyInfo(p, this),\n                IMethodSymbol c when c.MethodKind == MethodKind.Constructor => new RoslynConstructorInfo(c, this),\n                IMethodSymbol m => new RoslynMethodInfo(m, this),\n                IParameterSymbol param => new RoslynParameterInfo(param, this),\n                IAssemblySymbol a => new RoslynAssembly(a, this),\n                _ => null\n            });\n        }\n\n        public TMember ResolveMember<TMember>(TMember memberInfo) where TMember : MemberInfo\n        {\n            return memberInfo switch\n            {\n                RoslynFieldInfo f => (TMember)(object)f,\n                RoslynMethodInfo m => (TMember)(object)m,\n                RoslynPropertyInfo p => (TMember)(object)p,\n                MethodInfo m => (TMember)(object)ResolveType(m.ReflectedType)?.GetMethod(m.Name, SharedUtilities.ComputeBindingFlags(m), binder: null, types: m.GetParameters().Select(t => t.ParameterType).ToArray(), modifiers: null),\n                PropertyInfo p => (TMember)(object)ResolveType(p.ReflectedType)?.GetProperty(p.Name, SharedUtilities.ComputeBindingFlags(p), binder: null, returnType: p.PropertyType, types: p.GetIndexParameters().Select(t => t.ParameterType).ToArray(), modifiers: null),\n                FieldInfo f => (TMember)(object)ResolveType(f.ReflectedType)?.GetField(f.Name, SharedUtilities.ComputeBindingFlags(f)),\n                _ => null\n            };\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynAssembly.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynAssembly : Assembly\n    {\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynAssembly(IAssemblySymbol assembly, MetadataLoadContext metadataLoadContext)\n        {\n            Symbol = assembly;\n            _metadataLoadContext = metadataLoadContext;\n        }\n\n        public override string FullName => Symbol.Name;\n\n        internal IAssemblySymbol Symbol { get; }\n\n        public override Type[] GetExportedTypes()\n        {\n            return GetTypes();\n        }\n\n        public override Type[] GetTypes()\n        {\n            var types = new List<Type>();\n            var stack = new Stack<INamespaceSymbol>();\n            stack.Push(Symbol.GlobalNamespace);\n            while (stack.Count > 0)\n            {\n                var current = stack.Pop();\n\n                foreach (var type in current.GetTypeMembers())\n                {\n                    types.Add(type.AsType(_metadataLoadContext));\n                }\n\n                foreach (var ns in current.GetNamespaceMembers())\n                {\n                    stack.Push(ns);\n                }\n            }\n            return types.ToArray();\n        }\n\n        public override Type GetType(string name)\n        {\n            return Symbol.GetTypeByMetadataName(name).AsType(_metadataLoadContext);\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynConstructorInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynConstructorInfo : ConstructorInfo\n    {\n        private readonly IMethodSymbol _ctor;\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynConstructorInfo(IMethodSymbol ctor, MetadataLoadContext metadataLoadContext)\n        {\n            _ctor = ctor;\n            _metadataLoadContext = metadataLoadContext;\n            Attributes = SharedUtilities.GetMethodAttributes(ctor);\n        }\n\n        public override Type DeclaringType => _ctor.ContainingType.AsType(_metadataLoadContext);\n\n        public override MethodAttributes Attributes { get; }\n\n        public override RuntimeMethodHandle MethodHandle => throw new NotSupportedException();\n\n        public override string Name => _ctor.Name;\n\n        public override Type ReflectedType => throw new NotImplementedException();\n\n        public override bool IsGenericMethod => _ctor.IsGenericMethod;\n\n        public override Type[] GetGenericArguments()\n        {\n            var typeArguments = new List<Type>();\n            foreach (var t in _ctor.TypeArguments)\n            {\n                typeArguments.Add(t.AsType(_metadataLoadContext));\n            }\n            return typeArguments.ToArray();\n        }\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_ctor, _metadataLoadContext);\n        }\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override MethodImplAttributes GetMethodImplementationFlags()\n        {\n            throw new NotImplementedException();\n        }\n\n        public override ParameterInfo[] GetParameters()\n        {\n            List<ParameterInfo> parameters = default;\n            foreach (var p in _ctor.Parameters)\n            {\n                parameters ??= new();\n                parameters.Add(p.AsParameterInfo(_metadataLoadContext));\n            }\n            return parameters?.ToArray() ?? Array.Empty<ParameterInfo>();\n        }\n\n        public override object Invoke(BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynCustomAttributeData.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynCustomAttributeData : CustomAttributeData\n    {\n        public RoslynCustomAttributeData(AttributeData a, MetadataLoadContext metadataLoadContext)\n        {\n            if (a.AttributeConstructor is null)\n            {\n                throw new InvalidOperationException();\n            }\n\n            var namedArguments = new List<CustomAttributeNamedArgument>();\n            foreach (var na in a.NamedArguments)\n            {\n                var member = a.AttributeClass.BaseTypes().SelectMany(t => t.GetMembers(na.Key)).First();\n\n                MemberInfo memberInfo = member switch\n                {\n                    IPropertySymbol property => property.AsPropertyInfo(metadataLoadContext),\n                    IFieldSymbol field => field.AsFieldInfo(metadataLoadContext),\n                    IMethodSymbol ctor when ctor.MethodKind == MethodKind.Constructor => ctor.AsConstructorInfo(metadataLoadContext),\n                    IMethodSymbol method => method.AsMethodInfo(metadataLoadContext),\n                    ITypeSymbol typeSymbol => typeSymbol.AsType(metadataLoadContext),\n                    _ => null,\n                };\n\n                if (memberInfo is not null)\n                {\n                    namedArguments.Add(new CustomAttributeNamedArgument(memberInfo, na.Value.Value));\n                }\n            }\n\n            var constructorArguments = new List<CustomAttributeTypedArgument>();\n            foreach (var ca in a.ConstructorArguments)\n            {\n                if (ca.Kind == TypedConstantKind.Error)\n                {\n                    continue;\n                }\n\n                object value = ca.Kind == TypedConstantKind.Array ? ca.Values : ca.Value;\n                constructorArguments.Add(new CustomAttributeTypedArgument(ca.Type.AsType(metadataLoadContext), value));\n            }\n            Constructor = a.AttributeConstructor.AsConstructorInfo(metadataLoadContext);\n            NamedArguments = namedArguments;\n            ConstructorArguments = constructorArguments;\n        }\n\n        public override ConstructorInfo Constructor { get; }\n\n        public override IList<CustomAttributeNamedArgument> NamedArguments { get; }\n\n        public override IList<CustomAttributeTypedArgument> ConstructorArguments { get; }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    public static class RoslynExtensions\n    {\n        public static IMethodSymbol GetMethodSymbol(this MethodInfo methodInfo) => (methodInfo as RoslynMethodInfo)?.MethodSymbol;\n\n        public static IPropertySymbol GetPropertySymbol(this PropertyInfo property) => (property as RoslynPropertyInfo)?.PropertySymbol;\n        public static IFieldSymbol GetFieldSymbol(this FieldInfo field) => (field as RoslynFieldInfo)?.FieldSymbol;\n\n        public static IParameterSymbol GetParameterSymbol(this ParameterInfo parameterInfo) => (parameterInfo as RoslynParameterInfo)?.ParameterSymbol;\n\n        public static ITypeSymbol GetTypeSymbol(this Type type) => (type as RoslynType)?.TypeSymbol;\n    }\n\n    internal static class RoslynInternalExtensions\n    {\n        public static Assembly AsAssembly(this IAssemblySymbol assemblySymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<Assembly>(assemblySymbol);\n\n        public static Type AsType(this ITypeSymbol typeSymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<Type>(typeSymbol);\n\n        public static ParameterInfo AsParameterInfo(this IParameterSymbol parameterSymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<ParameterInfo>(parameterSymbol);\n\n        public static ConstructorInfo AsConstructorInfo(this IMethodSymbol methodSymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<ConstructorInfo>(methodSymbol);\n\n        public static MethodInfo AsMethodInfo(this IMethodSymbol methodSymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<MethodInfo>(methodSymbol);\n\n        public static PropertyInfo AsPropertyInfo(this IPropertySymbol propertySymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<PropertyInfo>(propertySymbol);\n\n        public static FieldInfo AsFieldInfo(this IFieldSymbol fieldSymbol, MetadataLoadContext metadataLoadContext) => metadataLoadContext.GetOrCreate<FieldInfo>(fieldSymbol);\n\n        public static IEnumerable<ITypeSymbol> BaseTypes(this ITypeSymbol typeSymbol)\n        {\n            var t = typeSymbol;\n            while (t != null)\n            {\n                yield return t;\n                t = t.BaseType;\n            }\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynFieldInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynFieldInfo : FieldInfo\n    {\n        private readonly IFieldSymbol _field;\n        private readonly MetadataLoadContext _metadataLoadContext;\n        private FieldAttributes? _attributes;\n\n        public RoslynFieldInfo(IFieldSymbol parameter, MetadataLoadContext metadataLoadContext)\n        {\n            _field = parameter;\n            _metadataLoadContext = metadataLoadContext;\n        }\n\n        public IFieldSymbol FieldSymbol => _field;\n\n        public override FieldAttributes Attributes\n        {\n            get\n            {\n                if (!_attributes.HasValue)\n                {\n                    _attributes = default(FieldAttributes);\n\n                    if (_field.IsStatic)\n                    {\n                        _attributes |= FieldAttributes.Static;\n                    }\n\n                    if (_field.IsReadOnly)\n                    {\n                        _attributes |= FieldAttributes.InitOnly;\n                    }\n\n                    switch (_field.DeclaredAccessibility)\n                    {\n                        case Accessibility.Public:\n                            _attributes |= FieldAttributes.Public;\n                            break;\n                        case Accessibility.Private:\n                            _attributes |= FieldAttributes.Private;\n                            break;\n                        case Accessibility.Protected:\n                            _attributes |= FieldAttributes.Family;\n                            break;\n                    }\n                }\n\n                return _attributes.Value;\n            }\n        }\n\n        public override RuntimeFieldHandle FieldHandle => throw new NotSupportedException();\n\n        public override Type FieldType => _field.Type.AsType(_metadataLoadContext);\n\n        public override Type DeclaringType => _field.ContainingType.AsType(_metadataLoadContext);\n\n        public override string Name => _field.Name;\n\n        public override Type ReflectedType => throw new NotImplementedException();\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object GetValue(object obj)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_field, _metadataLoadContext);\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override string ToString() => _field.ToString();\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynMemberInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\nnamespace Roslyn.Reflection\n{\n    internal class RoslynMemberInfo : MemberInfo\n    {\n        private readonly ISymbol _member;\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynMemberInfo(ISymbol member, MetadataLoadContext metadataLoadContext)\n        {\n            _member = member;\n            _metadataLoadContext = metadataLoadContext;\n        }\n\n        public override Type DeclaringType => _member.ContainingType.AsType(_metadataLoadContext);\n\n        public override MemberTypes MemberType => throw new NotImplementedException();\n\n        public override string Name => _member.Name;\n\n        public override Type ReflectedType => throw new NotImplementedException();\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_member, _metadataLoadContext);\n        }\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n    }\n}"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynMethodInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Globalization;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynMethodInfo : MethodInfo\n    {\n        private readonly IMethodSymbol _method;\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynMethodInfo(IMethodSymbol method, MetadataLoadContext metadataLoadContext)\n        {\n            _method = method;\n            _metadataLoadContext = metadataLoadContext;\n\n            Attributes = SharedUtilities.GetMethodAttributes(method);\n        }\n\n        public override ICustomAttributeProvider ReturnTypeCustomAttributes => throw new NotImplementedException();\n\n        public override MethodAttributes Attributes { get; }\n\n        public override RuntimeMethodHandle MethodHandle => throw new NotSupportedException();\n\n        public override Type DeclaringType => _method.ContainingType.AsType(_metadataLoadContext);\n\n        public override Type ReturnType => _method.ReturnType.AsType(_metadataLoadContext);\n\n        public override string Name => _method.Name;\n\n        public override bool IsGenericMethod => _method.IsGenericMethod;\n\n        public override Type ReflectedType => throw new NotImplementedException();\n\n        public IMethodSymbol MethodSymbol => _method;\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_method, _metadataLoadContext);\n        }\n\n        public override MethodInfo GetBaseDefinition()\n        {\n            var method = _method;\n\n            // Walk until we find the base definition for this method\n            while (method.OverriddenMethod is not null)\n            {\n                method = method.OverriddenMethod;\n            }\n\n            if (method.Equals(_method, SymbolEqualityComparer.Default))\n            {\n                return this;\n            }\n\n            return method.AsMethodInfo(_metadataLoadContext);\n        }\n\n        public override MethodInfo MakeGenericMethod(params Type[] typeArguments)\n        {\n            var typeSymbols = new ITypeSymbol[typeArguments.Length];\n            for (int i = 0; i < typeSymbols.Length; i++)\n            {\n                typeSymbols[i] = _metadataLoadContext.ResolveType(typeArguments[i]).GetTypeSymbol();\n            }\n            return _method.Construct(typeSymbols).AsMethodInfo(_metadataLoadContext);\n        }\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override Type[] GetGenericArguments()\n        {\n            List<Type> typeArguments = default;\n            foreach (var t in _method.TypeArguments)\n            {\n                typeArguments ??= new();\n                typeArguments.Add(t.AsType(_metadataLoadContext));\n            }\n            return typeArguments?.ToArray() ?? Array.Empty<Type>();\n        }\n\n        public override MethodImplAttributes GetMethodImplementationFlags()\n        {\n            throw new NotImplementedException();\n        }\n\n        public override ParameterInfo[] GetParameters()\n        {\n            List<ParameterInfo> parameters = default;\n            foreach (var p in _method.Parameters)\n            {\n                parameters ??= new();\n                parameters.Add(p.AsParameterInfo(_metadataLoadContext));\n            }\n            return parameters?.ToArray() ?? Array.Empty<ParameterInfo>();\n        }\n\n        public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override string ToString() => _method.ToString();\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynParameterInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    public class RoslynParameterInfo : ParameterInfo\n    {\n        private readonly IParameterSymbol _parameter;\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynParameterInfo(IParameterSymbol parameter, MetadataLoadContext metadataLoadContext)\n        {\n            _parameter = parameter;\n            _metadataLoadContext = metadataLoadContext;\n        }\n\n        public IParameterSymbol ParameterSymbol => _parameter;\n\n        public override Type ParameterType => _parameter.Type.AsType(_metadataLoadContext);\n        public override string Name => _parameter.Name;\n        public override bool HasDefaultValue => _parameter.HasExplicitDefaultValue;\n\n        public override object DefaultValue => HasDefaultValue ? _parameter.ExplicitDefaultValue : null;\n\n        public new bool IsOptional => HasDefaultValue || _parameter.NullableAnnotation == NullableAnnotation.Annotated;\n\n        public override int Position => _parameter.Ordinal;\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_parameter, _metadataLoadContext);\n        }\n\n        public override string ToString() => _parameter.ToString();\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynPropertyInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynPropertyInfo : PropertyInfo\n    {\n        private readonly IPropertySymbol _property;\n        private readonly MetadataLoadContext _metadataLoadContext;\n\n        public RoslynPropertyInfo(IPropertySymbol property, MetadataLoadContext metadataLoadContext)\n        {\n            _property = property;\n            _metadataLoadContext = metadataLoadContext;\n        }\n\n        public IPropertySymbol PropertySymbol => _property;\n\n        public override PropertyAttributes Attributes => throw new NotImplementedException();\n\n        public override bool CanRead => _property.GetMethod != null;\n\n        public override bool CanWrite => _property.SetMethod != null;\n\n        public override Type PropertyType => _property.Type.AsType(_metadataLoadContext);\n\n        public override Type DeclaringType => _property.ContainingType.AsType(_metadataLoadContext);\n\n        public override string Name => _property.Name;\n\n        public override Type ReflectedType => throw new NotImplementedException();\n\n        public override MethodInfo[] GetAccessors(bool nonPublic)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override MethodInfo GetGetMethod(bool nonPublic)\n        {\n            return _property.GetMethod.AsMethodInfo(_metadataLoadContext);\n        }\n\n        public override ParameterInfo[] GetIndexParameters()\n        {\n            List<ParameterInfo> parameters = default;\n            foreach (var p in _property.Parameters)\n            {\n                parameters ??= new();\n                parameters.Add(p.AsParameterInfo(_metadataLoadContext));\n            }\n            return parameters?.ToArray() ?? Array.Empty<ParameterInfo>();\n        }\n\n        public override MethodInfo GetSetMethod(bool nonPublic)\n        {\n            return _property.SetMethod.AsMethodInfo(_metadataLoadContext);\n        }\n\n        public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/RoslynType.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class RoslynType : Type\n    {\n        private readonly ITypeSymbol _typeSymbol;\n        private readonly MetadataLoadContext _metadataLoadContext;\n        private readonly bool _isByRef;\n        private TypeAttributes? _typeAttributes;\n\n        public RoslynType(ITypeSymbol typeSymbol, MetadataLoadContext metadataLoadContext, bool isByRef = false)\n        {\n            _typeSymbol = typeSymbol;\n            _metadataLoadContext = metadataLoadContext;\n            _isByRef = isByRef;\n        }\n\n        public override Assembly Assembly => _typeSymbol.ContainingAssembly.AsAssembly(_metadataLoadContext);\n\n        public override string AssemblyQualifiedName => throw new NotImplementedException();\n\n        public override Type BaseType => _typeSymbol.BaseType.AsType(_metadataLoadContext);\n\n        public override string FullName => Namespace is null ? Name : Namespace + \".\" + Name;\n\n        public override Guid GUID => Guid.Empty;\n\n        public override Module Module => throw new NotImplementedException();\n\n        public override string Namespace => _typeSymbol.ContainingNamespace?.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat.WithGlobalNamespaceStyle(SymbolDisplayGlobalNamespaceStyle.Omitted)) is { Length: > 0 } ns ? ns : null;\n\n        public override Type UnderlyingSystemType => this;\n\n        public override string Name => ArrayTypeSymbol is { } ar ? ar.ElementType.MetadataName + \"[]\" : _typeSymbol.MetadataName;\n\n        public override bool IsGenericType => NamedTypeSymbol?.IsGenericType ?? false;\n\n        private INamedTypeSymbol NamedTypeSymbol => _typeSymbol as INamedTypeSymbol;\n\n        private IArrayTypeSymbol ArrayTypeSymbol => _typeSymbol as IArrayTypeSymbol;\n\n        public override bool IsGenericTypeDefinition => IsGenericType && SymbolEqualityComparer.IncludeNullability.Equals(NamedTypeSymbol, NamedTypeSymbol.ConstructedFrom);\n\n        public override bool IsGenericParameter => _typeSymbol.TypeKind == TypeKind.TypeParameter;\n\n        public ITypeSymbol TypeSymbol => _typeSymbol;\n\n        public override bool IsEnum => _typeSymbol.TypeKind == TypeKind.Enum;\n\n        public override bool IsConstructedGenericType => NamedTypeSymbol?.IsUnboundGenericType == false;\n\n        public override Type DeclaringType => _typeSymbol.ContainingType?.AsType(_metadataLoadContext);\n\n        public override int GetArrayRank()\n        {\n            return ArrayTypeSymbol.Rank;\n        }\n\n        public override Type[] GetGenericArguments()\n        {\n            if (NamedTypeSymbol is null) return Array.Empty<Type>();\n            var args = new List<Type>();\n            foreach (var item in NamedTypeSymbol.TypeArguments)\n            {\n                args.Add(item.AsType(_metadataLoadContext));\n            }\n            return args.ToArray();\n        }\n\n        public override Type GetGenericTypeDefinition()\n        {\n            return NamedTypeSymbol?.ConstructedFrom.AsType(_metadataLoadContext) ?? throw new NotSupportedException();\n        }\n\n        public override IList<CustomAttributeData> GetCustomAttributesData()\n        {\n            return SharedUtilities.GetCustomAttributesData(_typeSymbol, _metadataLoadContext);\n        }\n\n        public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)\n        {\n            if (NamedTypeSymbol is null)\n            {\n                return Array.Empty<ConstructorInfo>();\n            }\n\n            List<ConstructorInfo> ctors = default;\n            foreach (var c in NamedTypeSymbol.Constructors)\n            {\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, c))\n                {\n                    continue;\n                }\n\n                ctors ??= new();\n                ctors.Add(c.AsConstructorInfo(_metadataLoadContext));\n            }\n            return ctors?.ToArray() ?? Array.Empty<ConstructorInfo>();\n        }\n\n        public override Type MakeByRefType()\n        {\n            return new RoslynType(_typeSymbol, _metadataLoadContext, isByRef: true);\n        }\n\n        public override object[] GetCustomAttributes(bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object[] GetCustomAttributes(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override Type MakeArrayType()\n        {\n            return _metadataLoadContext.Compilation.CreateArrayTypeSymbol(_typeSymbol).AsType(_metadataLoadContext);\n        }\n\n        public override Type MakeGenericType(params Type[] typeArguments)\n        {\n            if (!IsGenericTypeDefinition)\n            {\n                throw new NotSupportedException();\n            }\n\n            var typeSymbols = new ITypeSymbol[typeArguments.Length];\n            for (int i = 0; i < typeArguments.Length; i++)\n            {\n                typeSymbols[i] = _metadataLoadContext.ResolveType(typeArguments[i]).GetTypeSymbol();\n            }\n\n            return NamedTypeSymbol.Construct(typeSymbols).AsType(_metadataLoadContext);\n        }\n\n        public override Type GetElementType()\n        {\n            return ArrayTypeSymbol?.ElementType.AsType(_metadataLoadContext);\n        }\n\n        public override EventInfo GetEvent(string name, BindingFlags bindingAttr)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override EventInfo[] GetEvents(BindingFlags bindingAttr)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override FieldInfo GetField(string name, BindingFlags bindingAttr)\n        {\n            foreach (var symbol in _typeSymbol.GetMembers())\n            {\n                if (symbol is not IFieldSymbol fieldSymbol)\n                {\n                    continue;\n                }\n\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, symbol))\n                {\n                    continue;\n                }\n\n                return fieldSymbol.AsFieldInfo(_metadataLoadContext);\n            }\n\n            return null;\n        }\n\n        public override FieldInfo[] GetFields(BindingFlags bindingAttr)\n        {\n            List<FieldInfo> fields = default;\n\n            foreach (var symbol in _typeSymbol.GetMembers())\n            {\n                if (symbol is not IFieldSymbol fieldSymbol)\n                {\n                    continue;\n                }\n\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, symbol))\n                {\n                    continue;\n                }\n\n                fields ??= new();\n                fields.Add(fieldSymbol.AsFieldInfo(_metadataLoadContext));\n            }\n\n            return fields?.ToArray() ?? Array.Empty<FieldInfo>();\n        }\n\n        public override Type GetInterface(string name, bool ignoreCase)\n        {\n            var comparison = ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;\n            foreach (var i in _typeSymbol.Interfaces)\n            {\n                if (i.Name.Equals(name, comparison))\n                {\n                    return i.AsType(_metadataLoadContext);\n                }\n            }\n            return null;\n        }\n\n        public override Type[] GetInterfaces()\n        {\n            List<Type> interfaces = default;\n            foreach (var i in _typeSymbol.Interfaces)\n            {\n                interfaces ??= new();\n                interfaces.Add(i.AsType(_metadataLoadContext));\n            }\n            return interfaces?.ToArray() ?? Array.Empty<Type>();\n        }\n\n        public override MemberInfo[] GetMembers(BindingFlags bindingAttr)\n        {\n            List<MemberInfo> members = null;\n\n            foreach (var t in _typeSymbol.BaseTypes())\n            {\n                foreach (var symbol in t.GetMembers())\n                {\n                    if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, symbol))\n                    {\n                        continue;\n                    }\n\n                    MemberInfo member = symbol switch\n                    {\n                        IFieldSymbol f => f.AsFieldInfo(_metadataLoadContext),\n                        IPropertySymbol p => p.AsPropertyInfo(_metadataLoadContext),\n                        IMethodSymbol c when c.MethodKind == MethodKind.Constructor => c.AsConstructorInfo(_metadataLoadContext),\n                        IMethodSymbol m => m.AsMethodInfo(_metadataLoadContext),\n                        _ => null\n                    };\n\n                    if (member is null)\n                    {\n                        continue;\n                    }\n\n                    members ??= new();\n                    members.Add(member);\n                }\n            }\n\n            // https://github.com/dotnet/runtime/blob/9ec7fc21862f3446c6c6f7dcfff275942e3884d3/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L2693-L2694\n            bindingAttr &= ~BindingFlags.Static;\n            foreach (var type in GetNestedTypes(bindingAttr))\n            {\n                if (type.IsInterface)\n                {\n                    continue;\n                }\n\n                members ??= new();\n                members.Add(type);\n            }\n\n            return members?.ToArray() ?? Array.Empty<MemberInfo>();\n        }\n\n        public override MethodInfo[] GetMethods(BindingFlags bindingAttr)\n        {\n            List<MethodInfo> methods = null;\n\n            foreach (var t in _typeSymbol.BaseTypes())\n            {\n                foreach (var m in t.GetMembers())\n                {\n                    if (m is not IMethodSymbol method || method.MethodKind == MethodKind.Constructor)\n                    {\n                        continue;\n                    }\n\n                    if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, method))\n                    {\n                        continue;\n                    }\n\n                    methods ??= new();\n                    methods.Add(method.AsMethodInfo(_metadataLoadContext));\n                }\n            }\n\n            return methods?.ToArray() ?? Array.Empty<MethodInfo>();\n        }\n\n        public override Type GetNestedType(string name, BindingFlags bindingAttr)\n        {\n            foreach (var type in _typeSymbol.GetTypeMembers(name))\n            {\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, type))\n                {\n                    continue;\n                }\n\n                return type.AsType(_metadataLoadContext);\n            }\n            return null;\n        }\n\n        public override Type[] GetNestedTypes(BindingFlags bindingAttr)\n        {\n            List<Type> nestedTypes = default;\n            foreach (var type in _typeSymbol.GetTypeMembers())\n            {\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, type))\n                {\n                    continue;\n                }\n\n                nestedTypes ??= new();\n                nestedTypes.Add(type.AsType(_metadataLoadContext));\n            }\n            return nestedTypes?.ToArray() ?? Array.Empty<Type>();\n        }\n\n        public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)\n        {\n            List<PropertyInfo> properties = default;\n            foreach (var t in _typeSymbol.BaseTypes())\n            {\n                foreach (var symbol in t.GetMembers())\n                {\n                    if (symbol is not IPropertySymbol property)\n                    {\n                        continue;\n                    }\n\n                    if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, symbol))\n                    {\n                        continue;\n                    }\n\n                    properties ??= new();\n                    properties.Add(new RoslynPropertyInfo(property, _metadataLoadContext));\n                }\n            }\n            return properties?.ToArray() ?? Array.Empty<PropertyInfo>();\n        }\n\n        public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override bool IsDefined(Type attributeType, bool inherit)\n        {\n            throw new NotSupportedException();\n        }\n\n        protected override TypeAttributes GetAttributeFlagsImpl()\n        {\n            if (!_typeAttributes.HasValue)\n            {\n                _typeAttributes = default(TypeAttributes);\n\n                if (_typeSymbol.IsAbstract)\n                {\n                    _typeAttributes |= TypeAttributes.Abstract;\n                }\n\n                if (_typeSymbol.TypeKind == TypeKind.Interface)\n                {\n                    _typeAttributes |= TypeAttributes.Interface;\n                }\n\n                if (_typeSymbol.IsSealed)\n                {\n                    _typeAttributes |= TypeAttributes.Sealed;\n                }\n\n                bool isNested = _typeSymbol.ContainingType != null;\n\n                switch (_typeSymbol.DeclaredAccessibility)\n                {\n                    case Accessibility.NotApplicable:\n                    case Accessibility.Private:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedPrivate : TypeAttributes.NotPublic;\n                        break;\n                    case Accessibility.ProtectedAndInternal:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedFamANDAssem : TypeAttributes.NotPublic;\n                        break;\n                    case Accessibility.Protected:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedFamily : TypeAttributes.NotPublic;\n                        break;\n                    case Accessibility.Internal:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedAssembly : TypeAttributes.NotPublic;\n                        break;\n                    case Accessibility.ProtectedOrInternal:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedFamORAssem : TypeAttributes.NotPublic;\n                        break;\n                    case Accessibility.Public:\n                        _typeAttributes |= isNested ? TypeAttributes.NestedPublic : TypeAttributes.Public;\n                        break;\n                }\n            }\n\n            return _typeAttributes.Value;\n        }\n\n        protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)\n        {\n            // TODO: Use callConvention and modifiers\n            StringComparison comparison = (bindingAttr & BindingFlags.IgnoreCase) == BindingFlags.IgnoreCase\n                ? StringComparison.OrdinalIgnoreCase\n                : StringComparison.Ordinal;\n\n            foreach (var m in _typeSymbol.GetMembers())\n            {\n                if (m is not IMethodSymbol method || method.MethodKind != MethodKind.Constructor)\n                {\n                    // Only methods that are constructors\n                    continue;\n                }\n\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, m))\n                {\n                    continue;\n                }\n\n                var valid = true;\n\n                if (types is { Length: > 0 })\n                {\n                    var parameterCount = types.Length;\n\n                    // Compare parameter types\n                    if (parameterCount != method.Parameters.Length)\n                    {\n                        continue;\n                    }\n\n                    for (int i = 0; i < parameterCount; i++)\n                    {\n                        var parameterType = types[i];\n                        var parameterTypeSymbol = _metadataLoadContext.ResolveType(parameterType)?.GetTypeSymbol();\n\n                        if (parameterTypeSymbol is null)\n                        {\n                            valid = false;\n                            break;\n                        }\n\n                        if (!method.Parameters[i].Type.Equals(parameterTypeSymbol, SymbolEqualityComparer.Default))\n                        {\n                            valid = false;\n                            break;\n                        }\n                    }\n                }\n\n                if (valid)\n                {\n                    return new RoslynConstructorInfo(method, _metadataLoadContext);\n                }\n            }\n\n            return null;\n        }\n\n        protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)\n        {\n            // TODO: Use callConvention and modifiers\n            StringComparison comparison = (bindingAttr & BindingFlags.IgnoreCase) == BindingFlags.IgnoreCase\n                ? StringComparison.OrdinalIgnoreCase\n                : StringComparison.Ordinal;\n\n            foreach (var m in _typeSymbol.GetMembers())\n            {\n                if (m is not IMethodSymbol method || method.MethodKind == MethodKind.Constructor)\n                {\n                    // Only methods that are not constructors\n                    continue;\n                }\n\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, m))\n                {\n                    continue;\n                }\n\n                if (!method.Name.Equals(name, comparison))\n                {\n                    continue;\n                }\n\n                var valid = true;\n\n                if (types is { Length: > 0 })\n                {\n                    var parameterCount = types.Length;\n\n                    // Compare parameter types\n                    if (parameterCount != method.Parameters.Length)\n                    {\n                        continue;\n                    }\n\n                    for (int i = 0; i < parameterCount; i++)\n                    {\n                        var parameterType = types[i];\n                        var parameterTypeSymbol = _metadataLoadContext.ResolveType(parameterType)?.GetTypeSymbol();\n\n                        if (parameterTypeSymbol is null)\n                        {\n                            valid = false;\n                            break;\n                        }\n\n                        if (!method.Parameters[i].Type.Equals(parameterTypeSymbol, SymbolEqualityComparer.Default))\n                        {\n                            valid = false;\n                            break;\n                        }\n                    }\n                }\n\n                if (valid)\n                {\n                    return method.AsMethodInfo(_metadataLoadContext);\n                }\n            }\n\n            return null;\n        }\n\n        protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)\n        {\n            StringComparison comparison = (bindingAttr & BindingFlags.IgnoreCase) == BindingFlags.IgnoreCase\n                ? StringComparison.OrdinalIgnoreCase\n                : StringComparison.Ordinal;\n\n            foreach (var symbol in _typeSymbol.GetMembers())\n            {\n                if (symbol is not IPropertySymbol property)\n                {\n                    continue;\n                }\n\n                if (!SharedUtilities.MatchBindingFlags(bindingAttr, _typeSymbol, symbol))\n                {\n                    continue;\n                }\n\n                if (!property.Name.Equals(name, comparison))\n                {\n                    continue;\n                }\n\n                var roslynReturnType = _metadataLoadContext.ResolveType(returnType);\n\n                if (roslynReturnType?.Equals(property.Type) == false)\n                {\n                    continue;\n                }\n\n                if (types is { Length: > 0 })\n                {\n                    var parameterCount = types.Length;\n\n                    // Compare parameter types\n                    if (parameterCount != property.Parameters.Length)\n                    {\n                        continue;\n                    }\n                }\n                // TODO: Use parameters\n\n                return property.AsPropertyInfo(_metadataLoadContext);\n\n            }\n            return null;\n        }\n\n        protected override bool HasElementTypeImpl()\n        {\n            return ArrayTypeSymbol is not null;\n        }\n\n        protected override bool IsArrayImpl()\n        {\n            return ArrayTypeSymbol is not null;\n        }\n\n        protected override bool IsByRefImpl() => _isByRef;\n\n        protected override bool IsCOMObjectImpl()\n        {\n            throw new NotImplementedException();\n        }\n\n        protected override bool IsPointerImpl()\n        {\n            return _typeSymbol.Kind == SymbolKind.PointerType;\n        }\n\n        protected override bool IsPrimitiveImpl()\n        {\n            // Is IsPrimitive\n            // https://github.com/dotnet/runtime/blob/55e95c80a7d7ec9d7bbbd5ad434604a1dc33e19c/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/Types/RoType.TypeClassification.cs#L85\n\n            return _typeSymbol.SpecialType switch\n            {\n                SpecialType.System_Boolean => true,\n                SpecialType.System_Char => true,\n                SpecialType.System_SByte => true,\n                SpecialType.System_Byte => true,\n                SpecialType.System_Int16 => true,\n                SpecialType.System_UInt16 => true,\n                SpecialType.System_Int32 => true,\n                SpecialType.System_UInt32 => true,\n                SpecialType.System_Int64 => true,\n                SpecialType.System_UInt64 => true,\n                SpecialType.System_Single => true,\n                SpecialType.System_Double => true,\n                SpecialType.System_String => true,\n                SpecialType.System_IntPtr => true,\n                SpecialType.System_UIntPtr => true,\n                _ => false\n            };\n        }\n\n        public override string ToString()\n        {\n            return _typeSymbol.ToString();\n        }\n\n        public override bool IsAssignableFrom(Type c)\n        {\n            var otherTypeSymbol = c switch\n            {\n                RoslynType rt => rt._typeSymbol,\n                Type t when _metadataLoadContext.ResolveType(t) is RoslynType rt => rt._typeSymbol,\n                _ => null\n            };\n\n            if (otherTypeSymbol is null)\n            {\n                return false;\n            }\n\n            return otherTypeSymbol.AllInterfaces.Contains(_typeSymbol, SymbolEqualityComparer.Default) ||\n                   (otherTypeSymbol is INamedTypeSymbol ns && ns.BaseTypes().Contains(_typeSymbol, SymbolEqualityComparer.Default));\n        }\n\n        public override int GetHashCode()\n        {\n            return SymbolEqualityComparer.Default.GetHashCode(_typeSymbol);\n        }\n\n        public override bool Equals(object o)\n        {\n            var otherTypeSymbol = o switch\n            {\n                RoslynType rt => rt._typeSymbol,\n                Type t when _metadataLoadContext.ResolveType(t) is RoslynType rt => rt._typeSymbol,\n                ITypeSymbol ts => ts,\n                _ => null\n            };\n\n            return _typeSymbol.Equals(otherTypeSymbol, SymbolEqualityComparer.Default);\n        }\n\n        public override bool Equals(Type o)\n        {\n            var otherTypeSymbol = o switch\n            {\n                RoslynType rt => rt._typeSymbol,\n                Type t when _metadataLoadContext.ResolveType(t) is RoslynType rt => rt._typeSymbol,\n                _ => null\n            };\n            return _typeSymbol.Equals(otherTypeSymbol, SymbolEqualityComparer.Default);\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/Reflection/SharedUtilities.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.CodeAnalysis;\n\n#nullable disable\nnamespace Roslyn.Reflection\n{\n    internal class SharedUtilities\n    {\n        public static IList<CustomAttributeData> GetCustomAttributesData(ISymbol symbol, MetadataLoadContext metadataLoadContext)\n        {\n            List<CustomAttributeData> attributes = default;\n            foreach (var a in symbol.GetAttributes())\n            {\n                attributes ??= new();\n                attributes.Add(new RoslynCustomAttributeData(a, metadataLoadContext));\n            }\n            return (IList<CustomAttributeData>)attributes ?? Array.Empty<CustomAttributeData>();\n        }\n\n        public static MethodAttributes GetMethodAttributes(IMethodSymbol method)\n        {\n            MethodAttributes attributes = default;\n\n            if (method.IsAbstract)\n            {\n                attributes |= MethodAttributes.Abstract | MethodAttributes.Virtual;\n            }\n\n            if (method.IsStatic)\n            {\n                attributes |= MethodAttributes.Static;\n            }\n\n            if (method.IsVirtual || method.IsOverride)\n            {\n                attributes |= MethodAttributes.Virtual;\n            }\n\n            switch (method.DeclaredAccessibility)\n            {\n                case Accessibility.Public:\n                    attributes |= MethodAttributes.Public;\n                    break;\n                case Accessibility.Private:\n                    attributes |= MethodAttributes.Private;\n                    break;\n                case Accessibility.Internal:\n                    attributes |= MethodAttributes.Assembly;\n                    break;\n            }\n\n            if (method.MethodKind != MethodKind.Ordinary)\n            {\n                attributes |= MethodAttributes.SpecialName;\n            }\n\n            return attributes;\n        }\n\n        public static bool MatchBindingFlags(BindingFlags bindingFlags, ITypeSymbol thisType, ISymbol symbol)\n        {\n            var isPublic = (symbol.DeclaredAccessibility & Accessibility.Public) == Accessibility.Public;\n            var isNonProtectedInternal = (symbol.DeclaredAccessibility & Accessibility.ProtectedOrInternal) == 0;\n            var isStatic = symbol.IsStatic;\n            var isInherited = !SymbolEqualityComparer.Default.Equals(thisType, symbol.ContainingType);\n\n            // TODO: REVIEW precomputing binding flags\n            // From https://github.com/dotnet/runtime/blob/9ec7fc21862f3446c6c6f7dcfff275942e3884d3/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L2058\n\n            //var symbolBindingFlags = ComputeBindingFlags(isPublic, isStatic, isInherited);\n\n            //if (symbol is ITypeSymbol && !isStatic)\n            //{\n            //    symbolBindingFlags &= ~BindingFlags.Instance;\n            //}\n\n            // The below logic is a mishmash of copied logic from the following\n\n            // https://github.com/dotnet/runtime/blob/9ec7fc21862f3446c6c6f7dcfff275942e3884d3/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L2261\n\n            // filterFlags ^= BindingFlags.DeclaredOnly;\n\n            // https://github.com/dotnet/runtime/blob/9ec7fc21862f3446c6c6f7dcfff275942e3884d3/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs#L2153\n\n            //if ((filterFlags & symbolBindingFlags) != symbolBindingFlags)\n            //{\n            //    return false;\n            //}\n\n            // Filter by Public & Private\n            if (isPublic)\n            {\n                if ((bindingFlags & BindingFlags.Public) == 0)\n                {\n                    return false;\n                }\n            }\n            else\n            {\n                if ((bindingFlags & BindingFlags.NonPublic) == 0)\n                {\n                    return false;\n                }\n            }\n\n            // Filter by DeclaredOnly\n            if ((bindingFlags & BindingFlags.DeclaredOnly) != 0 && isInherited)\n            {\n                return false;\n            }\n\n            if (symbol is not ITypeSymbol)\n            {\n                if (isStatic)\n                {\n                    if ((bindingFlags & BindingFlags.FlattenHierarchy) == 0 && isInherited)\n                    {\n                        return false;\n                    }\n\n                    if ((bindingFlags & BindingFlags.Static) == 0)\n                    {\n                        return false;\n                    }\n                }\n                else\n                {\n                    if ((bindingFlags & BindingFlags.Instance) == 0)\n                    {\n                        return false;\n                    }\n                }\n            }\n\n            // @Asymmetry - Internal, inherited, instance, non -protected, non-virtual, non-abstract members returned\n            //              iff BindingFlags !DeclaredOnly, Instance and Public are present except for fields\n            if (((bindingFlags & BindingFlags.DeclaredOnly) == 0) &&        // DeclaredOnly not present\n                 isInherited &&                                            // Is inherited Member\n\n                isNonProtectedInternal &&                                 // Is non-protected internal member\n                ((bindingFlags & BindingFlags.NonPublic) != 0) &&           // BindingFlag.NonPublic present\n\n                (!isStatic) &&                                              // Is instance member\n                ((bindingFlags & BindingFlags.Instance) != 0))              // BindingFlag.Instance present\n            {\n                if (symbol is not IMethodSymbol method)\n                {\n                    return false;\n                }\n\n                if (!method.IsVirtual && !method.IsAbstract)\n                {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        public static BindingFlags ComputeBindingFlags(MemberInfo member)\n        {\n            if (member is PropertyInfo p)\n            {\n                return ComputeBindingFlags(p.GetMethod ?? p.SetMethod);\n            }\n\n            var (isPublic, isStatic) = member switch\n            {\n                FieldInfo f => (f.IsPublic, f.IsStatic),\n                MethodInfo m => (m.IsPublic, m.IsStatic),\n                _ => throw new NotSupportedException()\n            };\n\n            var isInherited = member.ReflectedType != member.DeclaringType;\n\n            return ComputeBindingFlags(isPublic, isStatic, isInherited);\n        }\n\n        private static BindingFlags ComputeBindingFlags(bool isPublic, bool isStatic, bool isInherited)\n        {\n            BindingFlags bindingFlags = isPublic ? BindingFlags.Public : BindingFlags.NonPublic;\n\n            if (isInherited)\n            {\n                // We arrange things so the DeclaredOnly flag means \"include inherited members\"\n                bindingFlags |= BindingFlags.DeclaredOnly;\n\n                if (isStatic)\n                {\n                    bindingFlags |= BindingFlags.Static | BindingFlags.FlattenHierarchy;\n                }\n                else\n                {\n                    bindingFlags |= BindingFlags.Instance;\n                }\n            }\n            else\n            {\n                if (isStatic)\n                {\n                    bindingFlags |= BindingFlags.Static;\n                }\n                else\n                {\n                    bindingFlags |= BindingFlags.Instance;\n                }\n            }\n\n            return bindingFlags;\n        }\n    }\n}\n#nullable restore\n"
  },
  {
    "path": "src/uController.SourceGenerator/ReflectionExtensions.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace uController\n{\n    internal static class ReflectionExtensions\n    {\n        public static CustomAttributeData GetCustomAttributeData(this MemberInfo memberInfo, Type type)\n        {\n            return memberInfo.CustomAttributes.FirstOrDefault(a => type.IsAssignableFrom(a.AttributeType));\n        }\n\n        public static CustomAttributeData GetCustomAttributeData(this ParameterInfo paramterInfo, Type type)\n        {\n            return paramterInfo.CustomAttributes.FirstOrDefault(a => type.IsAssignableFrom(a.AttributeType));\n        }\n\n        public static TValue GetConstructorArgument<TValue>(this CustomAttributeData customAttributeData, int index)\n        {\n            return index < customAttributeData.ConstructorArguments.Count ? (TValue)customAttributeData.ConstructorArguments[index].Value : default;\n        }\n\n        public static TValue GetNamedArgument<TValue>(this CustomAttributeData customAttributeData, string name)\n        {\n            return (TValue)customAttributeData.NamedArguments.FirstOrDefault(a => a.MemberName == name).TypedValue.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/RoutePattern.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace uController.SourceGenerator\n{\n    class RoutePattern\n    {\n        private static readonly char[] Slash = new[] { '/' };\n\n        public string Pattern { get; }\n\n        private string[] _parameterNames;\n\n        public RoutePattern(string pattern, string[] parameterNames)\n        {\n            Pattern = pattern;\n            _parameterNames = parameterNames;\n        }\n\n        public bool HasParameter(string name) => _parameterNames.Contains(name);\n\n        public override string ToString() => Pattern;\n\n        public static RoutePattern Parse(string pattern)\n        {\n            if (pattern is null)\n            {\n                return null;\n            }\n\n            var segments = pattern.Split(Slash, StringSplitOptions.RemoveEmptyEntries);\n\n            List<string> parameters = null;\n            foreach (var s in segments)\n            {\n                // Ignore complex segments and escaping\n\n                var start = s.IndexOf('{');\n                if (start != -1)\n                {\n                    var end = s.IndexOf('}', start + 1);\n\n                    if (end == -1)\n                    {\n                        continue;\n                    }\n\n                    var p = s.Substring(start + 1, end - start - 1);\n                    var constraintToken = p.IndexOf(':');\n\n                    if (constraintToken != -1)\n                    {\n                        // Remove the constraint\n                        p = p.Substring(0, constraintToken);\n                    }\n\n                    parameters ??= new();\n                    parameters.Add(p);\n                }\n            }\n\n            return new RoutePattern(pattern, parameters?.ToArray() ?? Array.Empty<string>());\n        }\n    }\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/WellKnownTypes.cs",
    "content": "﻿using System;\nusing System.Reflection;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Http.Metadata;\nusing Microsoft.AspNetCore.Routing;\nusing Roslyn.Reflection;\n\nnamespace uController.SourceGenerator\n{\n    internal class WellKnownTypes\n    {\n        public WellKnownTypes(MetadataLoadContext metadataLoadContext)\n        {\n            // REVIEW: Consider making this lazy\n            FromQueryMetadataType = metadataLoadContext.ResolveType<IFromQueryMetadata>();\n            FromRouteMetadataType = metadataLoadContext.ResolveType<IFromRouteMetadata>();\n            FromHeaderMetadataType = metadataLoadContext.ResolveType<IFromHeaderMetadata>();\n            FromFormMetadataType = metadataLoadContext.ResolveType<IFromFormMetadata>();\n            FromBodyMetadataType = metadataLoadContext.ResolveType<IFromBodyMetadata>();\n            FromServicesMetadataType = metadataLoadContext.ResolveType<IFromServiceMetadata>();\n            AsParametersAttributeType = metadataLoadContext.ResolveType<AsParametersAttribute>();\n            IEndpointMetadataProviderType = metadataLoadContext.ResolveType<IEndpointMetadataProvider>();\n            IEndpointParameterMetadataProviderType = metadataLoadContext.ResolveType<IEndpointParameterMetadataProvider>();\n            EndpointRouteBuilderType = metadataLoadContext.ResolveType<IEndpointRouteBuilder>();\n            DelegateType = metadataLoadContext.ResolveType<Delegate>();\n            IResultType = metadataLoadContext.ResolveType<IResult>();\n            HttpContextType = metadataLoadContext.ResolveType<HttpContext>();\n            ParamterInfoType = metadataLoadContext.ResolveType<ParameterInfo>();\n            IFormatProviderType = metadataLoadContext.ResolveType<IFormatProvider>();\n            EnumType = metadataLoadContext.ResolveType<Enum>();\n            ResultsType = metadataLoadContext.ResolveType<Results>();\n            TypedResultsType = metadataLoadContext.ResolveType<TypedResults>();\n            SourceKeyType = metadataLoadContext.ResolveType(\"Microsoft.AspNetCore.Builder.SourceKey\");\n        }\n\n        public Type FromQueryMetadataType { get; }\n        public Type FromRouteMetadataType { get; }\n        public Type FromHeaderMetadataType { get; }\n        public Type FromFormMetadataType { get; }\n        public Type FromBodyMetadataType { get; }\n        public Type FromServicesMetadataType { get; }\n        public Type AsParametersAttributeType { get; }\n        public Type IEndpointMetadataProviderType { get; }\n        public Type IEndpointParameterMetadataProviderType { get; }\n        public Type EndpointRouteBuilderType { get; }\n        public Type DelegateType { get; }\n        public Type IResultType { get; }\n        public Type HttpContextType { get; }\n        public Type ParamterInfoType { get; }\n        public Type IFormatProviderType { get; }\n        public Type EnumType { get; }\n        public Type ResultsType { get; }\n        public Type TypedResultsType { get; }\n        public Type SourceKeyType { get; }\n    }\n}\n"
  },
  {
    "path": "src/uController.SourceGenerator/uController.SourceGenerator.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <LangVersion>9.0</LangVersion>\n    <PackageDescription>The compile time code generator for Minimal APIs</PackageDescription>\n    <Authors>David Fowler</Authors>\n    <IncludeBuildOutput>false</IncludeBuildOutput>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <RestoreAdditionalProjectSources>https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json ;$(RestoreAdditionalProjectSources)</RestoreAdditionalProjectSources>\n  </PropertyGroup>\n\n  <ItemGroup>\n\n    <None Include=\"$(OutputPath)\\$(AssemblyName).dll\" Pack=\"true\" PackagePath=\"analyzers/dotnet/cs\" Visible=\"false\" />\n    <None Include=\"$(OutputPath)\\$(AssemblyName).pdb\" Pack=\"true\" PackagePath=\"analyzers/dotnet/cs\" Visible=\"false\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" Version=\"4.4.0-4.final\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.Analyzers\" Version=\"3.3.4-beta1.22518.1\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "src/uController.SourceGenerator/uControllerGenerator.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Operations;\nusing Microsoft.CodeAnalysis.Text;\nusing Microsoft.Extensions.Internal;\nusing Roslyn.Reflection;\n\nnamespace uController.SourceGenerator\n{\n    [Generator]\n    public class uControllerGenerator : ISourceGenerator\n    {\n        private static readonly Dictionary<string, string> MethodDescriptions = new()\n        {\n            [\"MapGet\"] = \"Get\",\n            [\"MapPost\"] = \"Post\",\n            [\"MapPut\"] = \"Put\",\n            [\"MapDelete\"] = \"Delete\",\n            [\"MapPatch\"] = \"Patch\"\n        };\n\n        public void Execute(GeneratorExecutionContext context)\n        {\n            if (context.SyntaxReceiver is not SyntaxReceiver receiver)\n            {\n                // nothing to do yet\n                return;\n            }\n\n            if (Environment.GetEnvironmentVariable(\"UCONTROLLER_DEBUG\") == \"1\")\n            {\n                System.Diagnostics.Debugger.Launch();\n            }\n\n            var metadataLoadContext = new MetadataLoadContext(context.Compilation);\n            var wellKnownTypes = new WellKnownTypes(metadataLoadContext);\n\n            var sb = new StringBuilder();\n            var thunks = new StringBuilder();\n            var genericThunks = new StringBuilder();\n            var generatedMethodSignatures = new HashSet<string>();\n\n            var knownTypedResultsMethods = wellKnownTypes.TypedResultsType?.GetMethods(BindingFlags.Public | BindingFlags.Static)\n                                                         .ToLookup(m => (m.Name, m.IsGenericMethod));\n\n            foreach (var invocation in receiver.MapActions)\n            {\n                var semanticModel = context.Compilation.GetSemanticModel(invocation.SyntaxTree);\n\n                var operation = semanticModel.GetOperation(invocation);\n\n                if (operation is IInvocationOperation { Arguments: { Length: 3 } parameters } invocationOperation &&\n                    wellKnownTypes.DelegateType.Equals(parameters[2].Parameter.Type) &&\n                    wellKnownTypes.EndpointRouteBuilderType.Equals(parameters[0].Parameter.Type))\n                {\n                    // We only want to generate overloads for calls that have a Delegate parameter\n                }\n                else\n                {\n                    continue;\n                }\n\n                var callName = invocationOperation.TargetMethod.Name;\n                var routePatternArgument = invocationOperation.Arguments[1];\n                var delegateArgument = invocationOperation.Arguments[2];\n\n                IOperation ResolveDeclarationOperation(ISymbol symbol)\n                {\n                    foreach (var syntaxReference in symbol.DeclaringSyntaxReferences)\n                    {\n                        var syn = syntaxReference.GetSyntax();\n\n                        if (syn is VariableDeclaratorSyntax\n                            {\n                                Initializer:\n                                {\n                                    Value: var expr\n                                }\n                            })\n                        {\n                            // Use the correct semantic model based on the syntax tree\n                            var operation = context.Compilation.GetSemanticModel(syn.SyntaxTree).GetOperation(expr);\n\n                            if (operation is not null)\n                            {\n                                return operation;\n                            }\n                        }\n                    }\n\n                    return null;\n                }\n\n                // Could be rewritten as a while loop\n                IMethodSymbol ResolveMethodFromOperation(IOperation operation) => operation switch\n                {\n                    IArgumentOperation argument => ResolveMethodFromOperation(argument.Value),\n                    IConversionOperation conv => ResolveMethodFromOperation(conv.Operand),\n                    IDelegateCreationOperation del => ResolveMethodFromOperation(del.Target),\n                    IFieldReferenceOperation f when f.Field.IsReadOnly && ResolveDeclarationOperation(f.Field) is IOperation op => ResolveMethodFromOperation(op),\n                    IAnonymousFunctionOperation anon => anon.Symbol,\n                    ILocalFunctionOperation local => local.Symbol,\n                    IMethodReferenceOperation method => method.Method,\n                    _ => null\n                };\n\n                var method = ResolveMethodFromOperation(delegateArgument);\n\n                if (method == null)\n                {\n                    context.ReportDiagnostic(Diagnostic.Create(Diagnostics.UnknownDelegateType, delegateArgument.Syntax.GetLocation(), delegateArgument.Syntax.ToFullString()));\n                    continue;\n                }\n\n                object ResolveLiteralOperation(IOperation operation) => operation switch\n                {\n                    IArgumentOperation argument => ResolveLiteralOperation(argument.Value),\n                    ILiteralOperation literal => literal.ConstantValue.Value,\n                    ILocalReferenceOperation l when l.Local.IsConst && ResolveDeclarationOperation(l.Local) is IOperation op => ResolveLiteralOperation(op),\n                    IFieldReferenceOperation f when f.Field.IsReadOnly && ResolveDeclarationOperation(f.Field) is IOperation op => ResolveLiteralOperation(op),\n                    _ => null\n                };\n\n                var routePattern = ResolveLiteralOperation(routePatternArgument) as string;\n\n                var methodModel = new MethodModel\n                {\n                    UniqueName = \"RequestHandler\",\n                    MethodInfo = method.AsMethodInfo(metadataLoadContext),\n                    RoutePattern = RoutePattern.Parse(routePattern)\n                };\n\n                var parameterIndex = 0;\n\n                foreach (var parameter in methodModel.MethodInfo.GetParameters())\n                {\n                    var fromQuery = parameter.GetCustomAttributeData(wellKnownTypes.FromQueryMetadataType);\n                    var fromHeader = parameter.GetCustomAttributeData(wellKnownTypes.FromHeaderMetadataType);\n                    var fromForm = parameter.GetCustomAttributeData(wellKnownTypes.FromFormMetadataType);\n                    var fromBody = parameter.GetCustomAttributeData(wellKnownTypes.FromBodyMetadataType);\n                    var fromRoute = parameter.GetCustomAttributeData(wellKnownTypes.FromRouteMetadataType);\n                    var fromService = parameter.GetCustomAttributeData(wellKnownTypes.FromServicesMetadataType);\n                    var asParameters = parameter.GetCustomAttributeData(wellKnownTypes.AsParametersAttributeType);\n\n                    var parameterModel = new ParameterModel\n                    {\n                        Method = methodModel,\n                        ParameterSymbol = parameter.GetParameterSymbol(),\n                        ParameterInfo = parameter,\n                        Name = parameter.Name,\n                        GeneratedName = \"arg_\" + parameter.Name,\n                        ParameterType = parameter.ParameterType,\n                        FromQuery = fromQuery == null ? null : fromQuery?.GetNamedArgument<string>(\"Name\") ?? parameter.Name,\n                        FromHeader = fromHeader == null ? null : fromHeader?.GetNamedArgument<string>(\"Name\") ?? parameter.Name,\n                        FromForm = fromForm == null ? null : fromForm?.GetNamedArgument<string>(\"Name\") ?? parameter.Name,\n                        FromRoute = fromRoute == null ? null : fromRoute?.GetNamedArgument<string>(\"Name\") ?? parameter.Name,\n                        FromBodyAttributeData = fromBody,\n                        FromServices = fromService != null,\n                        Index = parameterIndex\n                    };\n\n                    if (methodModel.RoutePattern is { } pattern)\n                    {\n                        if (pattern.HasParameter(parameter.Name))\n                        {\n                            parameterModel.FromRoute = parameter.Name;\n                        }\n                    }\n\n                    methodModel.Parameters.Add(parameterModel);\n                    parameterIndex++;\n                }\n\n                var codeGenerator = new MinimalCodeGenerator(wellKnownTypes);\n\n                for (int i = 0; i < 4; i++)\n                {\n                    codeGenerator.Indent();\n                }\n\n                codeGenerator.Generate(methodModel);\n\n                if (codeGenerator.BodyParameters.Count > 1)\n                {\n                    var mainLocation = (method.DeclaringSyntaxReferences[0].GetSyntax() switch\n                    {\n                        MethodDeclarationSyntax methodDeclarationSyntax => methodDeclarationSyntax.Identifier.GetLocation(),\n                        LocalFunctionStatementSyntax localFunctionStatementSyntax => localFunctionStatementSyntax.Identifier.GetLocation(),\n                        var expr => expr.GetLocation()\n                    });\n\n                    var otherLocations = new List<Location>();\n\n                    foreach (var p in codeGenerator.BodyParameters)\n                    {\n                        foreach (var syntaxReference in p.ParameterSymbol.DeclaringSyntaxReferences)\n                        {\n                            otherLocations.Add(syntaxReference.GetSyntax().GetLocation());\n                        }\n\n                        p.Unresovled = true;\n                    }\n\n                    context.ReportDiagnostic(Diagnostic.Create(Diagnostics.MultipleParametersConsumingBody, mainLocation, otherLocations));\n                }\n\n                var preReq = new StringBuilder();\n                var runtimeChecks = new StringBuilder();\n                var generatedRoutePatternVars = false;\n                var generatedBodyOrService = false;\n                var generatedParameterInfos = false;\n\n                foreach (var p in methodModel.Parameters)\n                {\n                    if (p.Unresovled)\n                    {\n                        var loc = p.ParameterSymbol.DeclaringSyntaxReferences[0].GetSyntax().GetLocation();\n                        if (p.HasBindingSource && !p.FromBody)\n                        {\n                            context.ReportDiagnostic(Diagnostic.Create(Diagnostics.UnableToResolveTryParseForType, loc, p.ParameterType.FullName));\n                        }\n                        else\n                        {\n                            context.ReportDiagnostic(Diagnostic.Create(Diagnostics.UnableToResolveParameter, loc, p.Name));\n                        }\n                    }\n\n                    if (p.QueryOrRoute)\n                    {\n                        if (!generatedRoutePatternVars)\n                        {\n                            generatedRoutePatternVars = true;\n                            preReq.AppendLine(\"                var routePattern = (builder as RouteEndpointBuilder)?.RoutePattern;\");\n                        }\n\n                        runtimeChecks.AppendLine($@\"                System.Func<HttpContext, string, Microsoft.Extensions.Primitives.StringValues?> {p.GeneratedName}RouteOrQueryResolver = routePattern?.GetParameter(\"\"{p.Name}\"\") is null ? ResolveByQuery : ResolveByRoute;\");\n                    }\n\n                    if (p.BodyOrService)\n                    {\n                        if (!generatedBodyOrService)\n                        {\n                            generatedBodyOrService = true;\n                            preReq.AppendLine(\"                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\");\n                        }\n\n                        var isOptional = p.ParameterSymbol.IsOptional || p.ParameterSymbol.NullableAnnotation == NullableAnnotation.Annotated;\n                        var resolveBody = isOptional ? $\"ResolveBodyOptional<{p.ParameterType}>\" : $\"ResolveBodyRequired<{p.ParameterType}>\";\n\n                        runtimeChecks.AppendLine($@\"                System.Func<HttpContext, System.Threading.Tasks.ValueTask<{p.ParameterType}>> {p.GeneratedName}ServiceOrBodyResolver = (ispis?.IsService(typeof({p.ParameterType.ToString().Replace(\"?\", string.Empty)})) ?? false) ? ResolveService<{p.ParameterType}>({isOptional.ToString().ToLower()}) : {resolveBody};\");\n                    }\n\n                    if (p.RequiresParameterInfo)\n                    {\n                        if (!generatedParameterInfos)\n                        {\n                            generatedParameterInfos = true;\n                            preReq.AppendLine(\"                var parameterInfos = del.Method.GetParameters();\");\n                        }\n\n                        runtimeChecks.AppendLine($@\"                var {p.GeneratedName}ParameterInfo = parameterInfos[{p.Index}];\");\n                    }\n                }\n\n                var hasAnonymoysParameterType = false;\n                // List of parameters and return type\n                var types = new List<string>();\n                foreach (var p in method.Parameters)\n                {\n                    if (p.Type.IsAnonymousType)\n                    {\n                        var loc = p.DeclaringSyntaxReferences[0].GetSyntax().GetLocation();\n                        context.ReportDiagnostic(Diagnostic.Create(Diagnostics.AnonymousTypesAsParametersAreNotSupported, loc));\n                    }\n\n                    types.Add(p.Type.ToDisplayString());\n                }\n\n                if (hasAnonymoysParameterType)\n                {\n                    // Don't generate this method\n                    continue;\n                }\n\n                if (method.ReturnType.IsAnonymousType)\n                {\n                    types.Add(\"T\");\n                }\n                else\n                {\n                    types.Add(method.ReturnType.ToDisplayString());\n                }\n\n                var formattedTypeArgs = string.Join(\", \", types);\n\n                formattedTypeArgs = method.ReturnsVoid ? string.Join(\", \", types.Take(types.Count - 1)) : formattedTypeArgs;\n                var delegateType = method.ReturnsVoid ? \"System.Action\" : \"System.Func\";\n                var fullDelegateType = formattedTypeArgs.Length == 0 ? delegateType : $\"{delegateType}<{formattedTypeArgs}>\";\n\n                // REVIEW: Figure out why open generics don't work\n                //var formattedOpenGenericArgs = string.Join(\", \", (method.ReturnsVoid ? types.Take(types.Count - 1) : types).Select((t, i) => $\"T{i}\"));\n                //formattedOpenGenericArgs = formattedOpenGenericArgs.Length == 0 ? formattedOpenGenericArgs : $\"<{formattedOpenGenericArgs}>\";\n                //var openGenericType = formattedOpenGenericArgs.Length == 0 ? delegateType : $\"{delegateType}{formattedOpenGenericArgs}\";\n\n                var filterArgumentString = string.Join(\", \", types.Take(types.Count - 1).Select((t, i) => $\"ic.GetArgument<{t}>({i})\"));\n\n                // Get the source location (file and line number)\n                var span = invocation.SyntaxTree.GetLineSpan(invocation.Span);\n                var lineNumber = span.StartLinePosition.Line + 1;\n\n                var filteredInvocationText = method.ReturnsVoid ?\n                    $@\"handler({filterArgumentString});\n                        return System.Threading.Tasks.ValueTask.FromResult<object?>(Results.Empty);\" :\n                    $@\"return System.Threading.Tasks.ValueTask.FromResult<object?>(handler({filterArgumentString}));\";\n\n                var populateMetadata = new StringBuilder();\n                var metadataPreReqs = new StringBuilder();\n                var generatedMetadataParameterInfo = false;\n                var generatedIsServiceProvider = false;\n\n                foreach (var p in methodModel.Parameters)\n                {\n                    if (wellKnownTypes.IEndpointMetadataProviderType?.IsAssignableFrom(p.ParameterType) is true)\n                    {\n                        populateMetadata.AppendLine($@\"                PopulateMetadata<{p.ParameterType}>(del.Method, builder);\");\n                    }\n\n                    if (wellKnownTypes.IEndpointParameterMetadataProviderType?.IsAssignableFrom(p.ParameterType) is true)\n                    {\n                        if (!generatedMetadataParameterInfo)\n                        {\n                            metadataPreReqs.AppendLine(\"                var parameterInfos = del.Method.GetParameters();\");\n                            generatedMetadataParameterInfo = true;\n                        }\n                        populateMetadata.AppendLine($@\"                PopulateMetadata<{p.ParameterType}>(parameterInfos[{p.Index}], builder);\");\n                    }\n\n                    if (p.FromBody)\n                    {\n                        var acceptsType = $\"{p.ParameterType}\".Trim('?');\n                        populateMetadata.AppendLine($@\"                builder.Metadata.Add(new AcceptsTypeMetadata(typeof({acceptsType}), true, new[] {{ \"\"application/json\"\" }}));\");\n                    }\n                    else if (p.BodyOrService)\n                    {\n                        var acceptsType = $\"{p.ParameterType}\".Trim('?');\n                        if (!generatedIsServiceProvider)\n                        {\n                            metadataPreReqs.AppendLine($@\"                var ispis = builder.ApplicationServices.GetService<IServiceProviderIsService>();\");\n                            generatedIsServiceProvider = true;\n                        }\n                        populateMetadata.AppendLine($@\"                if ((ispis?.IsService(typeof({acceptsType})) ?? false) == false) builder.Metadata.Add(new AcceptsTypeMetadata(typeof({acceptsType}), true, new[] {{ \"\"application/json\"\" }}));\");\n                    }\n\n                    if (p.ReadFromForm)\n                    {\n                        populateMetadata.AppendLine($@\"                builder.Metadata.Add(new AcceptsTypeMetadata(typeof({p.ParameterType}), true, new[] {{ \"\"multipart/form-data\"\" }}));\");  \n                    }\n                }\n\n                void AnalyzeResultTypesForIResultMethods(IMethodSymbol method, Type returnType)\n                {\n                    if (!wellKnownTypes.IResultType.Equals(returnType))\n                    {\n                        // Don't bother if we're not looking at an IResult returning method\n                        return;\n                    }\n\n                    foreach (var reference in method.DeclaringSyntaxReferences)\n                    {\n                        var syntax = reference.GetSyntax();\n\n                        var operation = semanticModel.GetOperation(syntax);\n                        // TODO: This needs a real detailed analysis working from return expressions, this is a bit of a hack right now\n                        // looking for *any* results call in this method. This should find all exit points from a method\n                        // and start from there.\n                        foreach (var op in operation.Descendants().OfType<IInvocationOperation>())\n                        {\n                            var resultsMethod = op.TargetMethod;\n\n                            if (resultsMethod.IsStatic &&\n                                wellKnownTypes.ResultsType.Equals(resultsMethod.ContainingType))\n                            {\n                                if (resultsMethod.Name == \"StatusCode\")\n                                {\n                                    // Try to resolve the status code statically\n                                    var literalExpression = ResolveLiteralOperation(op.Arguments[0].Value);\n\n                                    if (literalExpression is not null)\n                                    {\n                                        populateMetadata.AppendLine($@\"                builder.Metadata.Add(ResponseTypeMetadata.Create({literalExpression}));\");\n                                    }\n\n                                }\n                                else\n                                {\n                                    var candidate = knownTypedResultsMethods[(resultsMethod.Name, resultsMethod.IsGenericMethod)].FirstOrDefault();\n\n                                    if (candidate is not null)\n                                    {\n                                        if (candidate.IsGenericMethod)\n                                        {\n                                            candidate = candidate.MakeGenericMethod(resultsMethod.AsMethodInfo(metadataLoadContext).GetGenericArguments());\n                                        }\n                                    }\n\n                                    if (wellKnownTypes.IEndpointMetadataProviderType?.IsAssignableFrom(candidate.ReturnType) == true)\n                                    {\n                                        populateMetadata.AppendLine($@\"                PopulateMetadata<{candidate.ReturnType}>(del.Method, builder);\");\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                populateMetadata.AppendLine($@\"                builder.Metadata.Add(new SourceKey(@\"\"{invocation.SyntaxTree.FilePath}\"\", {lineNumber}));\");\n\n                var returnType = methodModel.MethodInfo.ReturnType;\n\n                if (AwaitableInfo.IsTypeAwaitable(returnType, out var awaitableInfo))\n                {\n                    returnType = awaitableInfo.ResultType;\n                }\n\n                AnalyzeResultTypesForIResultMethods(method, returnType);\n\n                if (returnType.Equals(typeof(void)))\n                {\n                    // Don't add metadata\n                }\n                else if (wellKnownTypes.IEndpointMetadataProviderType?.IsAssignableFrom(returnType) == true)\n                {\n                    // TODO: Result<T> internally uses reflection to call this method on it's generic args conditionally\n                    // we can avoid that reflection here.\n\n                    // Static abstract call\n                    populateMetadata.AppendLine($@\"                PopulateMetadata<{returnType}>(del.Method, builder);\");\n                }\n                else if (returnType.Equals(typeof(string)))\n                {\n                    // Add string plaintext\n                    populateMetadata.AppendLine($@\"                builder.Metadata.Add(ResponseTypeMetadata.Create(\"\"text/plain\"\"));\");\n                }\n                else if (!wellKnownTypes.IResultType.IsAssignableFrom(returnType))\n                {\n                    // Add JSON\n                    populateMetadata.AppendLine($@\"                builder.Metadata.Add(ResponseTypeMetadata.Create(\"\"application/json\"\", {(returnType.GetTypeSymbol().IsAnonymousType ? \"typeof(T)\" : $\"typeof({returnType.ToString().Replace(\"?\", string.Empty)})\")}));\");\n                }\n\n                var thunkBuilder = method.ReturnType.IsAnonymousType ? genericThunks : thunks;\n\n                // Generate code here for this thunk\n                thunkBuilder.Append($@\"            [(@\"\"{invocation.SyntaxTree.FilePath}\"\", {lineNumber})] = (\n           (del, builder) => \n            {{\n{metadataPreReqs.ToString().TrimEnd()}\n{populateMetadata.ToString().TrimEnd()}\n            }}, \n           (del, builder) => \n            {{\n                var handler = ({fullDelegateType})del;\n                EndpointFilterDelegate? filteredInvocation = null;\n{preReq}{runtimeChecks.ToString().TrimEnd()}\n                if (builder.FilterFactories.Count > 0)\n                {{\n                    filteredInvocation = BuildFilterDelegate(ic => \n                    {{\n                        if (ic.HttpContext.Response.StatusCode == 400)\n                        {{\n                            return System.Threading.Tasks.ValueTask.FromResult<object?>(Results.Empty);\n                        }}\n                        {filteredInvocationText}\n                    }},\n                    builder,\n                    handler.Method);\n                }}\n\n{codeGenerator}\n                return filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;\n            }}),\n\n\");\n\n                if (!generatedMethodSignatures.Add($\"{callName}_{fullDelegateType}\"))\n                {\n                    continue;\n                }\n\n                var verbArgument = MethodDescriptions.TryGetValue(callName, out var verb) ? $\"{verb}Verb\" : \"null\";\n\n                string methodText = null;\n\n                if (method.ReturnType.IsAnonymousType)\n                {\n                    methodText = @$\"        /// <summary>\n        /// Adds a <see cref=\"\"RouteEndpoint\"\"/> to the <see cref=\"\"IEndpointRouteBuilder\"\"/> that matches HTTP{(verb is not null ? \" \" + verb.ToUpperInvariant() : \"\")} requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"\"endpoints\"\">The <see cref=\"\"IEndpointRouteBuilder\"\"/> to add the route to.</param>\n        /// <param name=\"\"pattern\"\">The route pattern.</param>\n        /// <param name=\"\"handler\"\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"\"RouteHandlerBuilder\"\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder {callName}<T>(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, {fullDelegateType} handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\"\"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {{\n            return MapCore<T>(endpoints, pattern, handler, {verbArgument}, filePath, lineNumber);\n        }}\n\n\";\n                }\n                else\n                {\n                    methodText = @$\"        /// <summary>\n        /// Adds a <see cref=\"\"RouteEndpoint\"\"/> to the <see cref=\"\"IEndpointRouteBuilder\"\"/> that matches HTTP{(verb is not null ? \" \" + verb.ToUpperInvariant() : \"\")} requests\n        /// for the specified pattern.\n        /// </summary>\n        /// <param name=\"\"endpoints\"\">The <see cref=\"\"IEndpointRouteBuilder\"\"/> to add the route to.</param>\n        /// <param name=\"\"pattern\"\">The route pattern.</param>\n        /// <param name=\"\"handler\"\">The delegate executed when the endpoint is matched.</param>\n        /// <returns>A <see cref=\"\"RouteHandlerBuilder\"\"/> that can be used to further customize the endpoint.</returns>\n        internal static Microsoft.AspNetCore.Builder.RouteHandlerBuilder {callName}(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string pattern, {fullDelegateType} handler, [System.Runtime.CompilerServices.CallerFilePath] string filePath = \"\"\"\", [System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)\n        {{\n            return MapCore(endpoints, pattern, handler, {verbArgument}, filePath, lineNumber);\n        }}\n\n\";\n                }\n\n                sb.Append(methodText);\n            }\n\n            string sourceKeyText = wellKnownTypes.SourceKeyType is not null ? \"\" : @\"\nnamespace Microsoft.AspNetCore.Builder\n{\n    internal record SourceKey(string Path, int Line);\n}\n\";\n\n            var mapActionsText = $@\"\n//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\n#if NET7_0_OR_GREATER\n#nullable enable\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing System.IO;\nusing Microsoft.AspNetCore.Routing;\nusing Microsoft.AspNetCore.Routing.Patterns;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.FileProviders;\nusing Microsoft.Extensions.Primitives;\n\nusing MetadataPopulator = System.Action<System.Delegate, Microsoft.AspNetCore.Builder.EndpointBuilder>;\nusing RequestDelegateFactoryFunc = System.Func<System.Delegate, Microsoft.AspNetCore.Builder.EndpointBuilder, Microsoft.AspNetCore.Http.RequestDelegate>;\n{sourceKeyText}\ninternal static class GeneratedRouteBuilderExtensions\n{{\n    private static readonly string[] GetVerb = new[] {{ HttpMethods.Get }};\n    private static readonly string[] PostVerb = new[] {{ HttpMethods.Post }};\n    private static readonly string[] PutVerb = new[]  {{ HttpMethods.Put }};\n    private static readonly string[] DeleteVerb = new[] {{ HttpMethods.Delete }};\n    private static readonly string[] PatchVerb = new[] {{ HttpMethods.Patch }};\n\n    private class GenericThunks<T>\n    {{\n        public static readonly System.Collections.Generic.Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()\n        {{\n{genericThunks}\n        }};\n    }}\n\n    private static readonly System.Collections.Generic.Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()\n    {{\n{thunks}\n    }};\n{sb.ToString().TrimEnd()}\n\n    private static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapCore<T>(\n        this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder routes, \n        string pattern, \n        System.Delegate handler,\n        IEnumerable<string> httpMethods,\n        string filePath,\n        int lineNumber)\n    {{\n        var (populate, factory) = GenericThunks<T>.map[(filePath, lineNumber)];\n\n        return GetOrAddRouteEndpointDataSource(routes).AddRouteHandler(RoutePatternFactory.Parse(pattern), handler, httpMethods, isFallback: false, populate, factory);\n    }}\n\n    private static Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapCore(\n        this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder routes, \n        string pattern, \n        System.Delegate handler,\n        IEnumerable<string> httpMethods,\n        string filePath,\n        int lineNumber)\n    {{\n        var (populate, factory) = map[(filePath, lineNumber)];\n\n        return GetOrAddRouteEndpointDataSource(routes).AddRouteHandler(RoutePatternFactory.Parse(pattern), handler, httpMethods, isFallback: false, populate, factory);\n    }}\n\n    private static SourceGeneratedRouteEndpointDataSource GetOrAddRouteEndpointDataSource(IEndpointRouteBuilder endpoints)\n    {{\n        SourceGeneratedRouteEndpointDataSource? routeEndpointDataSource = null;\n\n        foreach (var dataSource in endpoints.DataSources)\n        {{\n            if (dataSource is SourceGeneratedRouteEndpointDataSource foundDataSource)\n            {{\n                routeEndpointDataSource = foundDataSource;\n                break;\n            }}\n        }}\n\n        if (routeEndpointDataSource is null)\n        {{\n            routeEndpointDataSource = new SourceGeneratedRouteEndpointDataSource(endpoints.ServiceProvider);\n            endpoints.DataSources.Add(routeEndpointDataSource);\n        }}\n\n        return routeEndpointDataSource;\n    }}\n\n    private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, System.Reflection.MethodInfo mi)\n    {{\n        var routeHandlerFilters =  builder.FilterFactories;\n\n        var context0 = new EndpointFilterFactoryContext\n        {{\n            MethodInfo = mi,\n            ApplicationServices = builder.ApplicationServices,\n        }};\n\n        var initialFilteredInvocation = filteredInvocation;\n\n        for (var i = routeHandlerFilters.Count - 1; i >= 0; i--)\n        {{\n            var filterFactory = routeHandlerFilters[i];\n            filteredInvocation = filterFactory(context0, filteredInvocation);\n        }}\n\n        return filteredInvocation;\n    }}\n\n    private static void PopulateMetadata<T>(System.Reflection.MethodInfo method, EndpointBuilder builder) where T : Microsoft.AspNetCore.Http.Metadata.IEndpointMetadataProvider\n    {{\n        T.PopulateMetadata(method, builder);\n    }}\n\n    private static void PopulateMetadata<T>(System.Reflection.ParameterInfo parameter, EndpointBuilder builder) where T : Microsoft.AspNetCore.Http.Metadata.IEndpointParameterMetadataProvider\n    {{\n        T.PopulateMetadata(parameter, builder);\n    }}\n\n    private static Task ExecuteObjectResult(object obj, HttpContext httpContext)\n    {{\n        if (obj is IResult r)\n        {{\n            return r.ExecuteAsync(httpContext);\n        }}\n        else if (obj is string s)\n        {{\n            return httpContext.Response.WriteAsync(s);\n        }}\n        else\n        {{\n            return httpContext.Response.WriteAsJsonAsync(obj);\n        }}\n    }}\n    private static Microsoft.Extensions.Primitives.StringValues? ResolveByQuery(HttpContext context, string key) => context.Request.Query[key];\n    private static Microsoft.Extensions.Primitives.StringValues? ResolveByRoute(HttpContext context, string key) => context.Request.RouteValues[key]?.ToString();\n    private static Func<HttpContext, ValueTask<T>> ResolveService<T>(bool isOptional) => isOptional\n        ? (HttpContext httpContext) => new ValueTask<T>(httpContext.RequestServices.GetService<T>())\n        : (HttpContext httpContext) => new ValueTask<T>(httpContext.RequestServices.GetRequiredService<T>());\n    private static async ValueTask<T?> ResolveBodyOptional<T>(HttpContext httpContext) => await ResolveBody<T>(httpContext, true);\n    private static async ValueTask<T?> ResolveBodyRequired<T>(HttpContext httpContext) => await ResolveBody<T>(httpContext, false);\n    private static async ValueTask<T?> ResolveBody<T>(HttpContext httpContext, bool allowEmpty)\n    {{\n        var feature = httpContext.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpRequestBodyDetectionFeature>();\n        if (feature?.CanHaveBody == true)\n        {{\n            if (!httpContext.Request.HasJsonContentType())\n            {{\n                httpContext.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;\n                return default;\n            }}\n            try\n            {{\n                var bodyValue = await httpContext.Request.ReadFromJsonAsync<T>();\n                if (!allowEmpty && bodyValue == null)\n                {{\n                    httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;\n                }}\n                return bodyValue;\n            }}\n            catch (IOException)\n            {{\n                return default;\n            }}\n            catch (System.Text.Json.JsonException)\n            {{\n                httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;\n                return default;\n            }}\n        }}\n        return default;\n    }}\n\n    private sealed class AcceptsTypeMetadata : Microsoft.AspNetCore.Http.Metadata.IAcceptsMetadata\n    {{\n        public IReadOnlyList<string> ContentTypes {{ get; }}\n\n        public Type RequestType {{ get; }}\n\n        public bool IsOptional {{ get; }}\n\n        public AcceptsTypeMetadata(Type type, bool isOptional, string[] contentTypes)\n        {{\n            RequestType = type ?? throw new ArgumentNullException(nameof(type));\n\n            if (contentTypes == null)\n            {{\n                throw new ArgumentNullException(nameof(contentTypes));\n            }}\n\n            ContentTypes = contentTypes;\n            IsOptional = isOptional;\n        }}\n    }}\n\n    private sealed class ResponseTypeMetadata : Microsoft.AspNetCore.Http.Metadata.IProducesResponseTypeMetadata\n    {{\n        public Type Type {{ get; set; }} = typeof(void);\n\n        public int StatusCode {{ get; set; }} = 200;\n\n        public IEnumerable<string> ContentTypes {{ get; init; }} = Enumerable.Empty<string>();\n\n        public static ResponseTypeMetadata Create(string contentType, Type? type = null)\n        {{\n            return new ResponseTypeMetadata {{ ContentTypes = new[] {{ contentType }}, Type = type }};\n        }}\n\n        public static ResponseTypeMetadata Create(int statusCode)\n        {{\n            return new ResponseTypeMetadata {{ StatusCode = statusCode }};\n        }}\n    }}\n\n    private sealed class SourceGeneratedRouteEndpointDataSource : EndpointDataSource\n    {{\n        private readonly List<RouteEntry> _routeEntries = new();\n        private readonly IServiceProvider _applicationServices;\n\n        public SourceGeneratedRouteEndpointDataSource(IServiceProvider applicationServices)\n        {{\n            _applicationServices = applicationServices;\n        }}\n\n        public RouteHandlerBuilder AddRouteHandler(\n            RoutePattern pattern,\n            Delegate routeHandler,\n            IEnumerable<string> httpMethods,\n            bool isFallback,\n            MetadataPopulator metadataPopulator,\n            RequestDelegateFactoryFunc requestDelegateFactoryFunc)\n        {{\n            var conventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();\n            var finallyConventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();\n\n            var routeAttributes = RouteAttributes.RouteHandler;\n            if (isFallback)\n            {{\n                routeAttributes |= RouteAttributes.Fallback;\n            }}\n\n            _routeEntries.Add(new()\n            {{\n                RoutePattern = pattern,\n                RouteHandler = routeHandler,\n                HttpMethods = httpMethods,\n                RouteAttributes = routeAttributes,\n                Conventions = conventions,\n                FinallyConventions = finallyConventions,\n                RequestDelegateFactory = requestDelegateFactoryFunc,\n                MetadataPopulator = metadataPopulator,\n            }});\n\n            return new RouteHandlerBuilder(new[] {{ new ConventionBuilder(conventions, finallyConventions) }});\n        }}\n\n        public override IReadOnlyList<RouteEndpoint> Endpoints\n        {{\n            get\n            {{\n                var endpoints = new RouteEndpoint[_routeEntries.Count];\n                for (int i = 0; i < _routeEntries.Count; i++)\n                {{\n                    endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i]).Build();\n                }}\n                return endpoints;\n            }}\n        }}\n\n        public override IReadOnlyList<RouteEndpoint> GetGroupedEndpoints(RouteGroupContext context)\n        {{\n            var endpoints = new RouteEndpoint[_routeEntries.Count];\n            for (int i = 0; i < _routeEntries.Count; i++)\n            {{\n                endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i], context.Prefix, context.Conventions, context.FinallyConventions).Build();\n            }}\n            return endpoints;\n        }}\n\n        public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;\n\n        private RouteEndpointBuilder CreateRouteEndpointBuilder(\n            RouteEntry entry, RoutePattern? groupPrefix = null, IReadOnlyList<Action<EndpointBuilder>>? groupConventions = null, IReadOnlyList<Action<EndpointBuilder>>? groupFinallyConventions = null)\n        {{\n            var pattern = RoutePatternFactory.Combine(groupPrefix, entry.RoutePattern);\n            var handler = entry.RouteHandler;\n            var isRouteHandler = (entry.RouteAttributes & RouteAttributes.RouteHandler) == RouteAttributes.RouteHandler;\n            var isFallback = (entry.RouteAttributes & RouteAttributes.Fallback) == RouteAttributes.Fallback;\n\n            var order = isFallback ? int.MaxValue : 0;\n            var displayName = pattern.RawText ?? pattern.ToString();\n\n            if (entry.HttpMethods is not null)\n            {{\n                // Prepends the HTTP method to the DisplayName produced with pattern + method name\n                displayName = $\"\"HTTP: {{string.Join(\"\", \"\", entry.HttpMethods)}} {{displayName}}\"\";\n            }}\n\n            if (isFallback)\n            {{\n                displayName = $\"\"Fallback {{displayName}}\"\";\n            }}\n\n            // If we're not a route handler, we started with a fully realized (although unfiltered) RequestDelegate, so we can just redirect to that\n            // while running any conventions. We'll put the original back if it remains unfiltered right before building the endpoint.\n            RequestDelegate? factoryCreatedRequestDelegate = null;\n\n            // Let existing conventions capture and call into builder.RequestDelegate as long as they do so after it has been created.\n            RequestDelegate redirectRequestDelegate = context =>\n            {{\n                if (factoryCreatedRequestDelegate is null)\n                {{\n                    throw new InvalidOperationException(\"\"Resources.RouteEndpointDataSource_RequestDelegateCannotBeCalledBeforeBuild\"\");\n                }}\n\n                return factoryCreatedRequestDelegate(context);\n            }};\n\n            // Add MethodInfo and HttpMethodMetadata (if any) as first metadata items as they are intrinsic to the route much like\n            // the pattern or default display name. This gives visibility to conventions like WithOpenApi() to intrinsic route details\n            // (namely the MethodInfo) even when applied early as group conventions.\n            RouteEndpointBuilder builder = new(redirectRequestDelegate, pattern, order)\n            {{\n                DisplayName = displayName,\n                ApplicationServices = _applicationServices,\n            }};\n\n            if (isRouteHandler)\n            {{\n                builder.Metadata.Add(handler.Method);\n            }}\n\n            if (entry.HttpMethods is not null)\n            {{\n                builder.Metadata.Add(new HttpMethodMetadata(entry.HttpMethods));\n            }}\n\n            // Apply group conventions before entry-specific conventions added to the RouteHandlerBuilder.\n            if (groupConventions is not null)\n            {{\n                foreach (var groupConvention in groupConventions)\n                {{\n                    groupConvention(builder);\n                }}\n            }}\n\n            // Any metadata inferred directly inferred by RDF or indirectly inferred via IEndpoint(Parameter)MetadataProviders are\n            // considered less specific than method-level attributes and conventions but more specific than group conventions\n            // so inferred metadata gets added in between these. If group conventions need to override inferred metadata,\n            // they can do so via IEndpointConventionBuilder.Finally like the do to override any other entry-specific metadata.\n            if (isRouteHandler)\n            {{\n                entry.MetadataPopulator(entry.RouteHandler, builder);\n            }}\n\n            // Add delegate attributes as metadata before entry-specific conventions but after group conventions.\n            var attributes = handler.Method.GetCustomAttributes();\n            if (attributes is not null)\n            {{\n                foreach (var attribute in attributes)\n                {{\n                    builder.Metadata.Add(attribute);\n                }}\n            }}\n\n            entry.Conventions.IsReadOnly = true;\n            foreach (var entrySpecificConvention in entry.Conventions)\n            {{\n                entrySpecificConvention(builder);\n            }}\n\n            // If no convention has modified builder.RequestDelegate, we can use the RequestDelegate returned by the RequestDelegateFactory directly.\n            var conventionOverriddenRequestDelegate = ReferenceEquals(builder.RequestDelegate, redirectRequestDelegate) ? null : builder.RequestDelegate;\n\n            if (isRouteHandler || builder.FilterFactories.Count > 0)\n            {{\n                factoryCreatedRequestDelegate = entry.RequestDelegateFactory(entry.RouteHandler, builder);\n            }}\n\n            Debug.Assert(factoryCreatedRequestDelegate is not null);\n\n            // Use the overridden RequestDelegate if it exists. If the overridden RequestDelegate is merely wrapping the final RequestDelegate,\n            // it will still work because of the redirectRequestDelegate.\n            builder.RequestDelegate = conventionOverriddenRequestDelegate ?? factoryCreatedRequestDelegate;\n\n            entry.FinallyConventions.IsReadOnly = true;\n            foreach (var entryFinallyConvention in entry.FinallyConventions)\n            {{\n                entryFinallyConvention(builder);\n            }}\n\n            if (groupFinallyConventions is not null)\n            {{\n                // Group conventions are ordered by the RouteGroupBuilder before\n                // being provided here.\n                foreach (var groupFinallyConvention in groupFinallyConventions)\n                {{\n                    groupFinallyConvention(builder);\n                }}\n            }}\n\n            return builder;\n        }}\n        private struct RouteEntry\n        {{\n            public MetadataPopulator MetadataPopulator {{ get; init; }}\n            public RequestDelegateFactoryFunc RequestDelegateFactory {{ get; init; }}\n            public RoutePattern RoutePattern {{ get; init; }}\n            public Delegate RouteHandler {{ get; init; }}\n            public IEnumerable<string> HttpMethods {{ get; init; }}\n            public RouteAttributes RouteAttributes {{ get; init; }}\n            public ThrowOnAddAfterEndpointBuiltConventionCollection Conventions {{ get; init; }}\n            public ThrowOnAddAfterEndpointBuiltConventionCollection FinallyConventions {{ get; init; }}\n        }}\n\n        [Flags]\n        private enum RouteAttributes\n        {{\n            // The endpoint was defined by a RequestDelegate, RequestDelegateFactory.Create() should be skipped unless there are endpoint filters.\n            None = 0,\n            // This was added as Delegate route handler, so RequestDelegateFactory.Create() should always be called.\n            RouteHandler = 1,\n            // This was added by MapFallback.\n            Fallback = 2,\n        }}\n\n        // This private class is only exposed to internal code via ICollection<Action<EndpointBuilder>> in RouteEndpointBuilder where only Add is called.\n        private sealed class ThrowOnAddAfterEndpointBuiltConventionCollection : List<Action<EndpointBuilder>>, ICollection<Action<EndpointBuilder>>\n        {{\n            // We throw if someone tries to add conventions to the RouteEntry after endpoints have already been resolved meaning the conventions\n            // will not be observed given RouteEndpointDataSource is not meant to be dynamic and uses NullChangeToken.Singleton.\n            public bool IsReadOnly {{ get; set; }}\n\n            void ICollection<Action<EndpointBuilder>>.Add(Action<EndpointBuilder> convention)\n            {{\n                if (IsReadOnly)\n                {{\n                    throw new InvalidOperationException(\"\"Resources.RouteEndpointDataSource_ConventionsCannotBeModifiedAfterBuild\"\");\n                }}\n\n                Add(convention);\n            }}\n        }}\n\n        private class ConventionBuilder : IEndpointConventionBuilder\n        {{\n            private readonly ICollection<Action<EndpointBuilder>> _conventions;\n            private readonly ICollection<Action<EndpointBuilder>> _finallyConventions;\n            public ConventionBuilder(ICollection<Action<EndpointBuilder>> conventions, ICollection<Action<EndpointBuilder>> finallyConventions)\n            {{\n                _conventions = conventions;\n                _finallyConventions = finallyConventions;\n            }}\n\n            /// <summary>\n            /// Adds the specified convention to the builder. Conventions are used to customize <see cref=\"\"EndpointBuilder\"\"/> instances.\n            /// </summary>\n            /// <param name=\"\"convention\"\">The convention to add to the builder.</param>\n            public void Add(Action<EndpointBuilder> convention)\n            {{\n                _conventions.Add(convention);\n            }}\n            public void Finally(Action<EndpointBuilder> finalConvention)\n            {{\n                _finallyConventions.Add(finalConvention);\n            }}\n        }}\n    }}\n}}\n#endif\n\";\n            if (sb.Length > 0)\n            {\n                context.AddSource($\"RouteBuilderExtensions.g.cs\", SourceText.From(mapActionsText, Encoding.UTF8));\n            }\n        }\n\n        public void Initialize(GeneratorInitializationContext context)\n        {\n            context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());\n        }\n\n        private class SyntaxReceiver : ISyntaxReceiver\n        {\n            private static readonly string[] KnownMethods = new[]\n            {\n                \"MapGet\",\n                \"MapPost\",\n                \"MapPut\",\n                \"MapDelete\",\n                \"MapPatch\",\n                \"Map\",\n                \"MapFallback\", // This doesn't work yet because it doesn't have a path\n            };\n\n            public List<InvocationExpressionSyntax> MapActions { get; } = new();\n\n            public void OnVisitSyntaxNode(SyntaxNode syntaxNode)\n            {\n                if (syntaxNode is InvocationExpressionSyntax\n                    {\n                        Expression: MemberAccessExpressionSyntax\n                        {\n                            Name: IdentifierNameSyntax\n                            {\n                                Identifier: { ValueText: var method }\n                            }\n                        },\n                        ArgumentList: { Arguments: { Count: 2 } args }\n                    } mapActionCall && KnownMethods.Contains(method))\n                {\n                    MapActions.Add(mapActionCall);\n                }\n            }\n        }\n    }\n\n    class Diagnostics\n    {\n        public static readonly DiagnosticDescriptor UnknownDelegateType = new DiagnosticDescriptor(\"MIN001\", \"DelegateTypeUnknown\", \"Unable to determine the parameter and return types from expression \\\"{0}\\\", only method groups, lambda expressions or readonly fields/variables are allowed\", \"Usage\", DiagnosticSeverity.Error, isEnabledByDefault: true);\n\n        public static readonly DiagnosticDescriptor UnableToResolveParameter = new DiagnosticDescriptor(\"MIN002\", \"ParameterSourceUnknown\", \"Unable to resolve \\\"{0}\\\", consider adding [FromXX] attributes to disambiguate the parameter source\", \"Usage\", DiagnosticSeverity.Error, isEnabledByDefault: true);\n\n        public static readonly DiagnosticDescriptor UnableToResolveTryParseForType = new DiagnosticDescriptor(\"MIN003\", \"MissingTryParseForType\", \"Unable to find a static {0}.TryParse(string, out {0}) implementation\", \"Usage\", DiagnosticSeverity.Error, isEnabledByDefault: true);\n\n        public static readonly DiagnosticDescriptor MultipleParametersConsumingBody = new DiagnosticDescriptor(\"MIN005\", \"MultipleParametersFromBody\", \"Detecting multiple parameters that attempt to read from the body, consider adding [FromXX] attributes to disambiguate the parameter source\", \"Usage\", DiagnosticSeverity.Error, isEnabledByDefault: true);\n\n        public static readonly DiagnosticDescriptor AnonymousTypesAsParametersAreNotSupported = new DiagnosticDescriptor(\"MIN006\", \"AnonymousTypesAsParametersAreNotSupported\", \"Anonymous types are not supported as parameters\", \"Usage\", DiagnosticSeverity.Error, isEnabledByDefault: true);\n    }\n}\n"
  },
  {
    "path": "test/uController.SourceGenerator.Tests/IntegrationTests.cs",
    "content": "using System.Globalization;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Numerics;\nusing System.Text.Json;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Http.Features;\nusing Microsoft.AspNetCore.Http.Metadata;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.CodeAnalysis.Emit;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\nusing Microsoft.Extensions.Primitives;\nusing MinimalApis.Extensions.Binding;\nusing Moq;\nusing JsonOptions = Microsoft.AspNetCore.Http.Json.JsonOptions;\n\nnamespace uController.SourceGenerator.Tests;\n\n// TODO: Migrate all tests from https://github.com/dotnet/aspnetcore/blob/main/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs\n// This is a subset.\n\npublic class IntegrationTests\n{\n    [Fact]\n    public async Task MapGet_NoParameters_StringReturn()\n    {\n        // Arrange\n        var source = @\"\napp.MapGet(\"\"/\"\", () => \"\"Hello world!\"\");\n\";\n\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = CreateEndpointBuilder();\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        var sourceKeyMetadata = endpoint.Metadata.GetMetadata<SourceKey>();\n        Assert.NotNull(sourceKeyMetadata);\n\n        var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();\n        Assert.NotNull(methodMetadata);\n        var method = Assert.Single(methodMetadata!.HttpMethods);\n        Assert.Equal(\"GET\", method);\n\n        await AssertEndpointBehavior(endpoint, \"Hello world!\", 200);\n    }\n\n    [Fact]\n    public async Task MapGet_StringRouteParameters_StringReturn()\n    {\n        // Arrange\n        var source = @\"\napp.MapGet(\"\"/hello/{name}\"\", (string name) => $\"\"Hello {name}!\"\");\n\";\n\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = CreateEndpointBuilder();\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        var sourceKeyMetadata = endpoint.Metadata.GetMetadata<SourceKey>();\n        Assert.NotNull(sourceKeyMetadata);\n\n        var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();\n        Assert.NotNull(methodMetadata);\n        var method = Assert.Single(methodMetadata!.HttpMethods);\n        Assert.Equal(\"GET\", method);\n\n        await AssertEndpointBehavior(\n            endpoint,\n            \"Hello Tester!\",\n            200,\n            routeValues: new(new[] { new KeyValuePair<string, string?>(\"name\", \"Tester\") }));\n    }\n\n    [Fact]\n    public async Task MapGet_StringQueryParameters_StringReturn()\n    {\n        // Arrange\n        var source = @\"\napp.MapGet(\"\"/hello\"\", (string name) => $\"\"Hello {name}!\"\");\n\";\n\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = CreateEndpointBuilder();\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        var sourceKeyMetadata = endpoint.Metadata.GetMetadata<SourceKey>();\n        Assert.NotNull(sourceKeyMetadata);\n\n        var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();\n        Assert.NotNull(methodMetadata);\n        var method = Assert.Single(methodMetadata!.HttpMethods);\n        Assert.Equal(\"GET\", method);\n\n        await AssertEndpointBehavior(\n            endpoint,\n            \"Hello David!\",\n            200,\n            query: QueryString.Create(\"name\", \"David\"));\n    }\n\n    [Fact]\n    public async Task MapGet_ImplicitFromService()\n    {\n        // Arrange\n        var source = $@\"\napp.MapGet(\"\"/\"\", ({typeof(TodoService)} todo) => todo.ToString());\n\";\n\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().AddSingleton<TodoService>().BuildServiceProvider()));\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        var sourceKeyMetadata = endpoint.Metadata.GetMetadata<SourceKey>();\n        Assert.NotNull(sourceKeyMetadata);\n\n        await AssertEndpointBehavior(endpoint, typeof(TodoService).ToString(), 200, builder.ServiceProvider);\n    }\n\n    [Fact]\n    public async Task MapGetWithNamedFromRouteParameter_UsesFromRouteName()\n    {\n        // Arrange\n        var source = $@\"\napp.MapGet(\"\"/{{value}}\"\", ([FromRoute(Name = \"\"value\"\")] int id, HttpContext httpContext) =>\n{{\n    httpContext.Items[\"\"value\"\"] = id;\n}});\n\";\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new EmptyServiceProvider()));\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        // Trigger Endpoint build by calling getter.\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        // Assert that we don't fallback to the query string\n        var httpContext = new DefaultHttpContext();\n\n        httpContext.Request.RouteValues[\"value\"] = \"42\";\n\n        await endpoint.RequestDelegate!(httpContext);\n\n        Assert.Equal(42, httpContext.Items[\"value\"]);\n    }\n\n    public static IEnumerable<object[]> NoResult\n    {\n        get\n        {\n            var testAction = \"\"\"\n            void TestAction(HttpContext httpContext)\n            {\n                httpContext.Items.Add(\"invoked\", true);\n            }\n            app.MapGet(\"/\", TestAction); \n            \"\"\";\n\n            // This binds to the RequestDelegate overload\n            //var taskTestAction = \"\"\"\n            //Task TaskTestAction(HttpContext httpContext)\n            //{\n            //    httpContext.Items.Add(\"invoked\", true);\n            //    return Task.CompletedTask;\n            //}\n            //app.MapGet(\"/\", TaskTestAction);\n            //\"\"\";\n\n            var valueTaskTestAction = \"\"\"\n            ValueTask ValueTaskTestAction(HttpContext httpContext)\n            {\n                httpContext.Items.Add(\"invoked\", true);\n                return ValueTask.CompletedTask;\n            }\n            app.MapGet(\"/\", ValueTaskTestAction);\n            \"\"\";\n\n            var staticTestAction = \"\"\"\n            void StaticTestAction(HttpContext httpContext)\n            {\n                httpContext.Items.Add(\"invoked\", true);\n            }\n            app.MapGet(\"/\", StaticTestAction);\n            \"\"\";\n\n            // This binds to the RequestDelegate overload\n            //var staticTaskTestAction = \"\"\"\n            //Task StaticTaskTestAction(HttpContext httpContext)\n            //{\n            //    httpContext.Items.Add(\"invoked\", true);\n            //    return Task.CompletedTask;\n            //}\n            //app.MapGet(\"/\", StaticTaskTestAction);\n            //\"\"\";\n\n            var staticValueTaskTestAction = \"\"\"\n            ValueTask StaticValueTaskTestAction(HttpContext httpContext)\n            {\n                httpContext.Items.Add(\"invoked\", true);\n                return ValueTask.CompletedTask;\n            }\n            app.MapGet(\"/\", StaticValueTaskTestAction);\n            \"\"\";\n\n            return new List<object[]>\n                {\n                    new object[] { testAction },\n                    // new object[] { taskTestAction },\n                    new object[] { valueTaskTestAction },\n                    new object[] { staticTestAction },\n                    // new object[] { staticTaskTestAction },\n                    new object[] { staticValueTaskTestAction },\n                };\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(NoResult))]\n    public async Task RequestDelegateInvokesAction(string source)\n    {\n        var requestDelegate = await GetRequestDelegate(source);\n\n        var httpContext = new DefaultHttpContext();\n\n        await requestDelegate(httpContext);\n\n        Assert.True(httpContext.Items[\"invoked\"] as bool?);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePopulatesFromRouteParameterBasedOnParameterName()\n    {\n        const string paramName = \"value\";\n        const int originalRouteParam = 42;\n\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        static void TestAction(HttpContext httpContext, [FromRoute] int value)\n        {\n            httpContext.Items.Add(\"input\", value);\n        }\n        app.MapGet(\"/\", TestAction);\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n        httpContext.Request.RouteValues[paramName] = originalRouteParam.ToString(NumberFormatInfo.InvariantInfo);\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(originalRouteParam, httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task SpecifiedRouteParametersDoNotFallbackToQueryString()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        app.MapGet(\"/{id}\", (int? id, HttpContext httpContext) =>\n        {\n            if (id is not null)\n            {\n                httpContext.Items[\"input\"] = id;\n            }\n        });\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n        httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>\n        {\n            [\"id\"] = \"42\"\n        });\n\n        await requestDelegate(httpContext);\n\n        Assert.Null(httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task SpecifiedQueryParametersDoNotFallbackToRouteValues()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        app.MapGet(\"/\", (int? id, HttpContext httpContext) =>\n        {\n            if (id is not null)\n            {\n                httpContext.Items[\"input\"] = id;\n            }\n        });\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n\n        httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>\n        {\n            [\"id\"] = \"41\"\n        });\n        httpContext.Request.RouteValues = new()\n        {\n            [\"id\"] = \"42\"\n        };\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(41, httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePopulatesFromRouteOptionalParameter()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        static void TestOptional(HttpContext httpContext, [FromRoute] int value = 42)\n        {\n            httpContext.Items.Add(\"input\", value);\n        }\n        app.MapGet(\"/\", TestOptional);\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(42, httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePopulatesFromNullableOptionalParameter()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        static void TestOptional(HttpContext httpContext, [FromRoute] int? value = 42)\n        {\n            httpContext.Items.Add(\"input\", value);\n        }\n        app.MapGet(\"/\", TestOptional);\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(42, httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePopulatesFromOptionalStringParameter()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        static void TestOptionalString(HttpContext httpContext, string value = \"default\")\n        {\n            httpContext.Items.Add(\"input\", value);\n        }\n        app.MapGet(\"/\", TestOptionalString);\n        \"\"\");\n        var httpContext = new DefaultHttpContext();\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(\"default\", httpContext.Items[\"input\"]);\n    }\n\n    [Fact]\n    public async Task Returns400IfNoMatchingRouteValueForRequiredParam()\n    {\n        const string unmatchedName = \"value\";\n        const int unmatchedRouteParam = 42;\n\n        var requestDelegate = await GetRequestDelegate(\n        \"\"\"\n        void TestAction([FromRoute] int foo, HttpContext httpContext)\n        {\n            httpContext.Items.Add(\"deserializedRouteParam\", foo);\n        }\n        app.MapGet(\"/\", TestAction);\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n        httpContext.Request.RouteValues[unmatchedName] = unmatchedRouteParam.ToString(NumberFormatInfo.InvariantInfo);\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(400, httpContext.Response.StatusCode);\n        Assert.Null(httpContext.Items[\"deserializedRouteParam\"]);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePrefersBindAsyncOverTryParse()\n    {\n        var requestDelegate = await GetRequestDelegate(\n        $$\"\"\"\n        app.MapGet(\"/\", (HttpContext httpContext, {{typeof(MyBindAsyncRecord)}} myBindAsyncRecord) =>\n        {\n            httpContext.Items[\"myBindAsyncRecord\"] = myBindAsyncRecord;\n        });\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n\n        httpContext.Request.Headers.Referer = \"https://example.org\";\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(new MyBindAsyncRecord(new Uri(\"https://example.org\")), httpContext.Items[\"myBindAsyncRecord\"]);\n    }\n\n    [Fact]\n    public async Task RequestDelegatePopulatesFromHeaderParameterBasedOnParameterName()\n    {\n        const string customHeaderName = \"X-Custom-Header\";\n        const int originalHeaderParam = 42;\n\n        var requestDelegate = await GetRequestDelegate(\n        $$\"\"\"\n        void TestAction(HttpContext httpContext, [FromHeader(Name = \"{{customHeaderName}}\")] int value)\n        {\n            httpContext.Items[\"deserializedRouteParam\"] = value;\n        }\n        app.MapGet(\"/\", TestAction);\n        \"\"\");\n\n        var httpContext = new DefaultHttpContext();\n        httpContext.Request.Headers[customHeaderName] = originalHeaderParam.ToString(NumberFormatInfo.InvariantInfo);\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(originalHeaderParam, httpContext.Items[\"deserializedRouteParam\"]);\n    }\n\n    public static object[][] ImplicitFromBodyActions(bool withAcceptsMetadata = false)\n    {\n        var testImpliedFromBody =\n        $$\"\"\" \n        void TestImpliedFromBody(HttpContext httpContext, {{typeof(Todo)}} todo)\n        {\n            httpContext.Items.Add(\"body\", todo);\n        }\n        app.MapPost(\"/\", TestImpliedFromBody);\n        \"\"\";\n\n        var testImpliedFromBodyInterface =\n        $$\"\"\"\n        void TestImpliedFromBodyInterface(HttpContext httpContext, {{typeof(ITodo)}} todo)\n        {\n            httpContext.Items.Add(\"body\", todo);\n        }\n        app.MapPost(\"/\", TestImpliedFromBodyInterface);\n        \"\"\";\n\n        var testImpliedFromBodyStruct =\n        $$\"\"\"\n        void TestImpliedFromBodyStruct(HttpContext httpContext, {{typeof(TodoStruct)}} todo)\n        {\n            httpContext.Items.Add(\"body\", todo);\n        }\n        app.MapPost(\"/\", TestImpliedFromBodyStruct);\n        \"\"\";\n\n        //void TestImpliedFromBodyStruct_ParameterList([AsParameters] ParametersListWithImplictFromBody args)\n        //{\n        //    args.HttpContext.Items.Add(\"body\", args.Todo);\n        //}\n\n        if (withAcceptsMetadata)\n        {\n            return new[]\n            {\n                new object[] { testImpliedFromBody, typeof(Todo), new[] { \"application/json\" } },\n                new object[] { testImpliedFromBodyInterface, typeof(ITodo), new[] { \"application/json\" } },\n                new object[] { testImpliedFromBodyStruct, typeof(TodoStruct), new[] { \"application/json\" } }\n                // new object[] { (Action<ParametersListWithImplictFromBody>)TestImpliedFromBodyStruct_ParameterList },\n            };\n        }\n        return new[]\n        {\n            new object[] { testImpliedFromBody },\n            new object[] { testImpliedFromBodyInterface  },\n            new object[] { testImpliedFromBodyStruct  }\n            // new object[] { (Action<ParametersListWithImplictFromBody>)TestImpliedFromBodyStruct_ParameterList },\n        };\n    }\n\n    public static object[][] ExplicitFromBodyActions(bool withAcceptsMetadata = false)\n    {\n        var TestExplicitFromBody =\n        $$\"\"\"\n        void TestExplicitFromBody(HttpContext httpContext, [FromBody] {{typeof(Todo)}} todo)\n        {\n            httpContext.Items.Add(\"body\", todo);\n        }\n        app.MapPost(\"/\", TestExplicitFromBody);\n        \"\"\";\n        // TBD\n        //void TestExplicitFromBody_ParameterList([AsParameters] ParametersListWithExplictFromBody args)\n        //{\n        //    args.HttpContext.Items.Add(\"body\", args.Todo);\n        //}\n\n        if (withAcceptsMetadata)\n        {\n\n            return new[]\n            {\n                new object[] { TestExplicitFromBody, typeof(Todo), new[] { \"application/json\" } },\n                // new object[] { (Action<ParametersListWithExplictFromBody>)TestExplicitFromBody_ParameterList },\n            };\n        }\n        return new[]\n        {\n            new object[] { TestExplicitFromBody  },\n            // new object[] { (Action<ParametersListWithExplictFromBody>)TestExplicitFromBody_ParameterList },\n        };\n    }\n\n    public static object[][] FromBodyActions\n    {\n        get\n        {\n            return ExplicitFromBodyActions().Concat(ImplicitFromBodyActions()).ToArray();\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(FromBodyActions))]\n    public async Task RequestDelegatePopulatesFromBodyParameter(string source)\n    {\n        RequestDelegate requestDelegate = await GetRequestDelegate(source);\n\n        Todo originalTodo = new()\n        {\n            Name = \"Write more tests!\"\n        };\n\n        var httpContext = new DefaultHttpContext();\n\n        var requestBodyBytes = JsonSerializer.SerializeToUtf8Bytes(originalTodo);\n        var stream = new MemoryStream(requestBodyBytes);\n        httpContext.Request.Body = stream;\n\n        httpContext.Request.Headers[\"Content-Type\"] = \"application/json\";\n        httpContext.Request.Headers[\"Content-Length\"] = stream.Length.ToString(CultureInfo.InvariantCulture);\n        httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));\n\n        var jsonOptions = new JsonOptions();\n        jsonOptions.SerializerOptions.Converters.Add(new TodoJsonConverter());\n\n        var mock = new Mock<IServiceProvider>();\n        mock.Setup(m => m.GetService(It.IsAny<Type>())).Returns<Type>(t =>\n        {\n            if (t == typeof(IOptions<JsonOptions>))\n            {\n                return Options.Create(jsonOptions);\n            }\n            return null;\n        });\n        httpContext.RequestServices = mock.Object;\n\n        await requestDelegate(httpContext);\n\n        var deserializedRequestBody = httpContext.Items[\"body\"];\n        Assert.NotNull(deserializedRequestBody);\n        Assert.Equal(originalTodo.Name, ((ITodo)deserializedRequestBody!).Name);\n    }\n\n    public static object?[][] TryParsableParameters\n    {\n        get\n        {\n            var now = DateTime.Now;\n\n            var types = new List<(Type, object, object)>\n            {\n                (typeof(string)         , \"plain string\", \"plain string\" ),\n                (typeof(int)            , \"-42\", -42 ),\n                (typeof(int?)           , \"42\", 42),\n                (typeof(uint)           , \"42\", 42U ),\n                (typeof(bool)           , \"true\", true ),\n                (typeof(short)          , \"-42\", (short)-42 ),\n                (typeof(ushort)         , \"42\", (ushort)42 ),\n                (typeof(long)           , \"-42\", -42L ),\n                (typeof(ulong)          , \"42\", 42UL ),\n                (typeof(IntPtr)         , \"-42\", new IntPtr(-42) ),\n                (typeof(char)           , \"A\", 'A' ),\n                (typeof(double)         , \"0.5\", 0.5 ),\n                (typeof(float)          , \"0.5\", 0.5f ),\n                (typeof(Half)           , \"0.5\", (Half)0.5f ),\n                (typeof(decimal)        , \"0.5\", 0.5m ),\n                // TBD\n                // (typeof(Uri)            , \"https://example.org\", new Uri(\"https://example.org\") ),\n                // (typeof(DateTime)       , now.ToString(\"o\"), now.ToUniversalTime() ),\n                (typeof(DateTimeOffset) , \"1970-01-01T00:00:00.0000000+00:00\", DateTimeOffset.UnixEpoch ),\n                (typeof(TimeSpan)       , \"00:00:42\", TimeSpan.FromSeconds(42) ),\n                (typeof(Guid)           , \"00000000-0000-0000-0000-000000000000\", Guid.Empty ),\n                (typeof(Version)        , \"6.0.0.42\", new Version(\"6.0.0.42\") ),\n                (typeof(BigInteger)     , \"-42\", new BigInteger(-42) ),\n                (typeof(IPAddress)      , \"127.0.0.1\", IPAddress.Loopback ),\n                (typeof(IPEndPoint)     , \"127.0.0.1:80\", new IPEndPoint(IPAddress.Loopback, 80) ),\n                (typeof(AddressFamily)  , \"Unix\", AddressFamily.Unix ),\n            };\n\n            // TBD\n            //new object[] { (Action<HttpContext, ILOpCode>)Store, \"Nop\", ILOpCode.Nop },\n            //new object[] { (Action<HttpContext, AssemblyFlags>)Store, \"PublicKey,Retargetable\", AssemblyFlags.PublicKey | AssemblyFlags.Retargetable },\n            //new object[] { (Action<HttpContext, int?>)Store, \"42\", 42 },\n            //new object[] { (Action<HttpContext, MyEnum>)Store, \"ValueB\", MyEnum.ValueB },\n            //new object[] { (Action<HttpContext, MyTryParseRecord>)Store, \"https://example.org\", new MyTryParseRecord(new Uri(\"https://example.org\")) },\n            //new object?[] { (Action<HttpContext, int?>)Store, null, null },\n            static Type? Unwrap(Type type)\n            {\n                if (type.IsGenericType && !type.IsGenericTypeDefinition)\n                {\n                    // instantiated generic type only\n                    Type genericType = type.GetGenericTypeDefinition();\n                    if (genericType.Equals(typeof(Nullable<>)))\n                    {\n                        return type.GetGenericArguments()[0];\n                    }\n                }\n                return null;\n            }\n\n            var results = new List<object[]>();\n            foreach (var (type, val, expected) in types)\n            {\n                var source =\n                $$\"\"\"\n                static void Store(HttpContext httpContext, {{(Unwrap(type) is Type t ? $\"{t}?\" : $\"{type}\")}} tryParsable)\n                {\n                    httpContext.Items[\"tryParsable\"] = tryParsable;\n                }\n                app.MapGet(\"/{tryParsable}\", Store);\n                \"\"\";\n\n                results.Add(new[] { source, val, expected });\n            }\n\n            return results.ToArray();\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(TryParsableParameters))]\n    public async Task RequestDelegatePopulatesUnattributedTryParsableParametersFromRouteValue(string source, string? routeValue, object? expectedParameterValue)\n    {\n        var requestDelegate = await GetRequestDelegate(source);\n\n        var httpContext = new DefaultHttpContext();\n        httpContext.Request.RouteValues[\"tryParsable\"] = routeValue;\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(expectedParameterValue, httpContext.Items[\"tryParsable\"]);\n    }\n\n\n    public static object[][] ExplicitFromServiceActions\n    {\n        get\n        {\n            var testExplicitFromService =\n            $$\"\"\"\n            void TestExplicitFromService(HttpContext httpContext, [{{typeof(FromServiceAttribute)}}] {{typeof(MyService)}} myService)\n            {\n                httpContext.Items.Add(\"service\", myService);\n            }\n            app.MapGet(\"/\", TestExplicitFromService);\n            \"\"\";\n\n            // TBD\n            //void TestExplicitFromService_FromParameterList([AsParameters] ParametersListWithExplictFromService args)\n            //{\n            //    args.HttpContext.Items.Add(\"service\", args.MyService);\n            //}\n\n            var testExplicitFromIEnumerableService =\n            $$\"\"\"\n            void TestExplicitFromIEnumerableService(HttpContext httpContext, [{{typeof(FromServiceAttribute)}}] IEnumerable<{{typeof(MyService)}}> myServices)\n            {\n                httpContext.Items.Add(\"service\", myServices.Single());\n            }\n            app.MapGet(\"/\", TestExplicitFromIEnumerableService);\n            \"\"\";\n\n            var testExplictMultipleFromService =\n            $$\"\"\"\n            void TestExplicitMultipleFromService(HttpContext httpContext, [{{typeof(FromServiceAttribute)}}] {{typeof(MyService)}} myService, [{{typeof(FromServiceAttribute)}}] IEnumerable<{{typeof(MyService)}}> myServices)\n            {\n                httpContext.Items.Add(\"service\", myService);\n            }\n            app.MapGet(\"/\", TestExplicitMultipleFromService);\n            \"\"\";\n\n            return new object[][]\n            {\n                    new[] { testExplicitFromService },\n                    // TBD\n                    // new object[] { (Action<ParametersListWithExplictFromService>)TestExplicitFromService_FromParameterList },\n                    new[] { testExplicitFromIEnumerableService },\n                    new[] { testExplictMultipleFromService },\n            };\n        }\n    }\n\n    public static object[][] ImplicitFromServiceActions\n    {\n        get\n        {\n            var testImpliedFromService =\n            $$\"\"\"\n            void TestImpliedFromService(HttpContext httpContext, {{typeof(IMyService)}} myService)\n            {\n                httpContext.Items.Add(\"service\", myService);\n            }\n            app.MapGet(\"/\", TestImpliedFromService);\n            \"\"\";\n\n            //void TestImpliedFromService_FromParameterList([AsParameters] ParametersListWithImplictFromService args)\n            //{\n            //    args.HttpContext.Items.Add(\"service\", args.MyService);\n            //}\n\n            var testImpliedIEnumerableFromService =\n            $$\"\"\"\n            void TestImpliedIEnumerableFromService(HttpContext httpContext, IEnumerable<{{typeof(MyService)}}> myServices)\n            {\n                httpContext.Items.Add(\"service\", myServices.Single());\n            }\n            app.MapGet(\"/\", TestImpliedIEnumerableFromService);\n            \"\"\";\n\n            var testImpliedFromServiceBasedOnContainer =\n            $$\"\"\"\n            void TestImpliedFromServiceBasedOnContainer(HttpContext httpContext, {{typeof(MyService)}} myService)\n            {\n                httpContext.Items.Add(\"service\", myService);\n            }\n            app.MapGet(\"/\", TestImpliedFromServiceBasedOnContainer);\n            \"\"\";\n\n            return new object[][]\n            {\n                    new[] { testImpliedFromService },\n                    // new object[] { (Action<ParametersListWithImplictFromService>)TestImpliedFromService_FromParameterList },\n                    new[] { testImpliedIEnumerableFromService },\n                    new[] { testImpliedFromServiceBasedOnContainer },\n            };\n        }\n    }\n\n\n    [Theory]\n    [MemberData(nameof(FromServiceActions))]\n    public async Task RequestDelegatePopulatesParametersFromServiceWithAndWithoutAttribute(string source)\n    {\n        var myOriginalService = new MyService();\n\n        var serviceCollection = new ServiceCollection();\n        serviceCollection.AddSingleton(myOriginalService);\n        serviceCollection.AddSingleton<IMyService>(myOriginalService);\n        var services = serviceCollection.BuildServiceProvider();\n\n        var requestDelegate = await GetRequestDelegate(source, services);\n\n        using var requestScoped = services.CreateScope();\n\n        var httpContext = new DefaultHttpContext\n        {\n            RequestServices = requestScoped.ServiceProvider\n        };\n\n        await requestDelegate(httpContext);\n\n        Assert.Same(myOriginalService, httpContext.Items[\"service\"]);\n    }\n\n    public static object[][] FromServiceActions\n    {\n        get\n        {\n            return ImplicitFromServiceActions.Concat(ExplicitFromServiceActions).ToArray();\n        }\n    }\n\n    public static object[][] FromFormActions(bool withAcceptsMetadata = false)\n    {\n        var implicitFromFormFile =\n        $$\"\"\"\n        app.MapPost(\"/fileupload\", (IFormFile file) =>\n        {\n            return $\"Uploaded {file.Name}\";\n        });\n        \"\"\";\n\n        var implicitFromFormCollection =\n        $$\"\"\"\n        app.MapPost(\"/formpost\", (IFormCollection formCollection) =>\n        {\n            return $\"Uploaded {formCollection.Count} files\";\n        });\n        \"\"\";\n\n        var explicitFromFormFile =\n        $$\"\"\"\n        app.MapPost(\"/fileupload\", ([FromForm] IFormFile file) =>\n        {\n            return $\"Uploaded {file.Name}\";\n        });\n        \"\"\";\n\n        var explicitFromFormCollection =\n        $$\"\"\"\n        app.MapPost(\"/formpost\", ([FromForm] IFormCollection formCollection) =>\n        {\n            return $\"Uploaded {formCollection.Count} files\";\n        });\n        \"\"\";\n\n        if (withAcceptsMetadata)\n        {\n            return new[]\n            {\n                new[] { (object)implicitFromFormFile, typeof(IFormFile), new[] { \"multipart/form-data\" }},\n                new[] { (object)implicitFromFormCollection, typeof(IFormCollection), new[] { \"multipart/form-data\" }},\n                new[] { (object)explicitFromFormFile, typeof(IFormFile), new[] { \"multipart/form-data\" }},\n                new[] { (object)explicitFromFormCollection, typeof(IFormCollection), new[] { \"multipart/form-data\" }}\n            };\n        }\n\n        return new[]\n        {\n            new[] { (object)implicitFromFormFile },\n            new[] { (object)implicitFromFormCollection },\n            new[] { (object)explicitFromFormFile },\n            new[] { (object)explicitFromFormCollection }\n        };\n    }\n\n    [Theory]\n    [MemberData(nameof(ImplicitFromBodyActions), parameters: new object[] { true })]\n    [MemberData(nameof(ExplicitFromBodyActions), parameters: new object[] { true })]\n    [MemberData(nameof(FromFormActions), parameters: new object[] { true })]\n    public async Task PopulatesAcceptsMetadataForRequestBody(string source, Type expectedType, string[] expectedContentTypes)\n    {\n        var endpoint = await GetEndpoint(source);\n\n        var acceptsMetadata = endpoint.Metadata.GetMetadata<IAcceptsMetadata>();\n        Assert.NotNull(acceptsMetadata);\n\n        Assert.Equal(expectedType, acceptsMetadata.RequestType);\n        Assert.Equal(expectedContentTypes, acceptsMetadata.ContentTypes);\n    }\n\n    [Theory]\n    [MemberData(nameof(FromServiceActions))]\n    public async Task DoesNotPopulateAcceptsMetadataForServices(string source)\n    {\n        var myOriginalService = new MyService();\n        var serviceProvider = new ServiceCollection()\n            .AddSingleton(myOriginalService)\n            .AddSingleton<IMyService>(myOriginalService)\n            .BuildServiceProvider();\n        var endpoint = await GetEndpoint(source, serviceProvider);\n\n        var acceptsMetadata = endpoint.Metadata.GetMetadata<IAcceptsMetadata>();\n        Assert.Null(acceptsMetadata);\n    }\n\n    [Fact]\n    public async Task SupportsNullableReferenceTypesInParameters()\n    {\n        var source = \"\"\"\n        app.MapGet(\"/\", (string? nullableString, DateTime? nullableDateTime) => $\"{nullableString} {nullableDateTime}\");\n        \"\"\";\n\n        var endpoint = await GetEndpoint(source);\n    }\n\n    public static object?[][] FromQueryOptionality\n    {\n        get\n        {\n            var requiredQueryParam = \"\"\"app.MapGet(\"/\", (string name) => $\"Hello {name}!\");\"\"\";\n            var defaultValueQueryParam = \"\"\"\n            string defaultValueQueryParam(string name = \"DefaultName\") => $\"Hello {name}!\";\n            app.MapGet(\"/\", defaultValueQueryParam);\n            \"\"\";\n            var nullableQueryParam = \"\"\"app.MapGet(\"/\", (string? name) => $\"Hello {name}!\");\"\"\";\n            var requiredParseableQueryParam = \"\"\"app.MapGet(\"/\", (int age) => $\"Age: {age}\");\"\"\";\n            var defaultValueParseableQueryParam = \"\"\"\n            string defaultValuePareseableQueryParam(int age = 12) => $\"Age: {age}\";\n            app.MapGet(\"/\", defaultValuePareseableQueryParam);\n            \"\"\";\n            var nullableQueryParseableParam = \"\"\"app.MapGet(\"/\", (int? age) => $\"Age: {age}\");\"\"\";\n\n            return new[]\n            {\n                new object?[] { requiredQueryParam, \"name\", null, 400, null},\n                new object?[] { requiredQueryParam, \"name\", \"TestName\", 200, \"Hello TestName!\" },\n                new object?[] { defaultValueQueryParam, \"name\", null, 200, \"Hello DefaultName!\" },\n                new object?[] { defaultValueQueryParam, \"name\", \"TestName\", 200, \"Hello TestName!\" },\n                new object?[] { nullableQueryParam, \"name\", null, 200, \"Hello !\" },\n                new object?[] { nullableQueryParam, \"name\", \"TestName\", 200, \"Hello TestName!\"},\n\n                new object?[] { requiredParseableQueryParam, \"age\", null, 400, null},\n                new object?[] { requiredParseableQueryParam, \"age\", \"42\", 200, \"Age: 42\" },\n                new object?[] { defaultValueParseableQueryParam, \"age\", null, 200, \"Age: 12\" },\n                new object?[] { defaultValueParseableQueryParam, \"age\", \"42\", 200, \"Age: 42\" },\n                new object?[] { nullableQueryParseableParam, \"age\", null, 200, \"Age: \" },\n                new object?[] { nullableQueryParseableParam, \"age\", \"42\", 200, \"Age: 42\"},\n            };\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(FromQueryOptionality))]\n    public async Task HandlesQueryParamOptionality(string source, string paramName, string? queryParam, int expectedStatusCode, string? expectedResponse)\n    {\n        var endpoint = await GetEndpoint(source);\n        QueryString? query = queryParam is not null ? QueryString.Create(paramName, queryParam) : null;\n\n        await AssertEndpointBehavior(\n                endpoint,\n                expectedResponse ?? string.Empty,\n                expectedStatusCode,\n                query: query);\n    }\n\n    public static object?[][] FromRouteOptionality\n    {\n        get\n        {\n            var requiredRouteParam = \"\"\"app.MapGet(\"/{name}\", (string name) => $\"Hello {name}!\");\"\"\";\n            var defaultValueRouteParam = \"\"\"\n            string defaultValueQueryParam(string name = \"DefaultName\") => $\"Hello {name}!\";\n            app.MapGet(\"/{name}\", defaultValueQueryParam);\n            \"\"\";\n            var nullableRouteParam = \"\"\"app.MapGet(\"/{name}\", (string? name) => $\"Hello {name}!\");\"\"\";\n            var requiredParseableRouteParam = \"\"\"app.MapGet(\"/{age}\", (int age) => $\"Age: {age}\");\"\"\";\n            var defaultValueParseableRouteParam = \"\"\"\n            string defaultValuePareseableRouteParam(int age = 12) => $\"Age: {age}\";\n            app.MapGet(\"/{age}\", defaultValuePareseableRouteParam);\n            \"\"\";\n            var nullableQueryParseableParam = \"\"\"app.MapGet(\"/{age}\", (int? age) => $\"Age: {age}\");\"\"\";\n\n            return new[]\n            {\n                new object?[] { requiredRouteParam, \"name\", null, 400, null},\n                new object?[] { requiredRouteParam, \"name\", \"TestName\", 200, \"Hello TestName!\" },\n                new object?[] { defaultValueRouteParam, \"name\", null, 200, \"Hello DefaultName!\" },\n                new object?[] { defaultValueRouteParam, \"name\", \"TestName\", 200, \"Hello TestName!\" },\n                new object?[] { nullableRouteParam, \"name\", null, 200, \"Hello !\" },\n                new object?[] { nullableRouteParam, \"name\", \"TestName\", 200, \"Hello TestName!\"},\n\n                new object?[] { requiredParseableRouteParam, \"age\", null, 400, null},\n                new object?[] { requiredParseableRouteParam, \"age\", \"42\", 200, \"Age: 42\" },\n                new object?[] { defaultValueParseableRouteParam, \"age\", null, 200, \"Age: 12\" },\n                new object?[] { defaultValueParseableRouteParam, \"age\", \"42\", 200, \"Age: 42\" },\n                new object?[] { nullableQueryParseableParam, \"age\", null, 200, \"Age: \" },\n                new object?[] { nullableQueryParseableParam, \"age\", \"42\", 200, \"Age: 42\"},\n            };\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(FromRouteOptionality))]\n    public async Task HandlesRouteParamOptionality(string source, string paramName, string? routeParam, int expectedStatusCode, string? expectedResponse)\n    {\n        var endpoint = await GetEndpoint(source);\n        var routeValue = routeParam is not null ? new RouteValueDictionary { { paramName, routeParam } } : null;\n\n        await AssertEndpointBehavior(\n                endpoint,\n                expectedResponse ?? string.Empty,\n                expectedStatusCode,\n                routeValues: routeValue);\n    }\n\n    public static object?[][] FromBodyOptionality\n    {\n        get\n        {\n            var requiredBodyParam = $\"\"\"\n            app.MapPost(\"/todo\", ({typeof(Todo)} todo) => todo);\n            \"\"\";\n\n            var defaultValueBodyParam = $\"\"\"\n            {typeof(Todo)}? getTodo({typeof(Todo)}? todo = default) => todo;\n            app.MapPost(\"/todo\", getTodo);\n            \"\"\";\n\n            var nullableBodyParam = $\"\"\"\n            app.MapPost(\"/todo-1\", ({typeof(Todo)}? todo) => todo);\n            \"\"\";\n\n            var disallowEmptyAndNonOptional = $\"\"\"\n            app.MapPost(\"/todo-2\", ([{typeof(FromBodyAttribute)}(AllowEmpty = false)] {typeof(Todo)} todo) => todo);\n            \"\"\";\n            \n            var allowEmptyAndNonOptional = $\"\"\"\n            app.MapPost(\"/todo-3\", ([{typeof(FromBodyAttribute)}(AllowEmpty = true)] {typeof(Todo)} todo) => todo);\n            \"\"\";\n            \n            var allowEmptyAndOptional = $\"\"\"\n            app.MapPost(\"/todo-4\", ([{typeof(FromBodyAttribute)}(AllowEmpty = true)] {typeof(Todo)}? todo) => todo);\n            \"\"\";\n            \n            var disallowEmptyAndOptional = $\"\"\"\n            app.MapPost(\"/todo-5\", ([{typeof(FromBodyAttribute)}(AllowEmpty = false)] {typeof(Todo)}? todo) => todo);\n            \"\"\";\n\n            var todo = new Todo { Name = \"Run tests\" };\n\n            return new[]\n            {\n                new object?[] { requiredBodyParam, null, 400 },\n                new object?[] { requiredBodyParam, todo, 200 },\n                new object?[] { defaultValueBodyParam, null, 200 },\n                new object?[] { defaultValueBodyParam, todo, 200 },\n                new object?[] { nullableBodyParam, null, 200 },\n                new object?[] { nullableBodyParam, todo, 200 },\n                new object?[] { disallowEmptyAndNonOptional, null, 400 },\n                new object?[] { allowEmptyAndNonOptional, null, 200 },\n                new object?[] { allowEmptyAndOptional, null, 200 },\n                new object?[] { disallowEmptyAndOptional, null, 200 }\n            };\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(FromBodyOptionality))]\n    public async Task HandlesBodyParamOptionality(string source, Todo? bodyParam, int expectedStatusCode)\n    {\n        var requestDelegate = await GetRequestDelegate(source);\n        var httpContext = new DefaultHttpContext();\n\n        var outStream = new MemoryStream();\n        httpContext.Response.Body = outStream;\n\n        var requestBodyBytes = JsonSerializer.SerializeToUtf8Bytes(bodyParam);\n        var stream = new MemoryStream(requestBodyBytes);\n        httpContext.Request.Body = stream;\n\n        httpContext.Request.Headers[\"Content-Type\"] = \"application/json\";\n        httpContext.Request.Headers[\"Content-Length\"] = stream.Length.ToString(CultureInfo.InvariantCulture);\n        httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));\n\n        var jsonOptions = new JsonOptions();\n        jsonOptions.SerializerOptions.Converters.Add(new TodoJsonConverter());\n\n        var mock = new Mock<IServiceProvider>();\n        mock.Setup(m => m.GetService(It.IsAny<Type>())).Returns<Type>(t =>\n        {\n            if (t == typeof(IOptions<JsonOptions>))\n            {\n                return Options.Create(jsonOptions);\n            }\n            return null;\n        });\n        httpContext.RequestServices = mock.Object;\n\n        await requestDelegate(httpContext);\n\n        Assert.Equal(expectedStatusCode, httpContext.Response.StatusCode);\n\n        if (expectedStatusCode == 200)\n        {\n            var httpResponse = httpContext.Response;\n            httpResponse.Body.Seek(0, SeekOrigin.Begin);\n            var streamReader = new StreamReader(httpResponse.Body);\n            var body = await streamReader.ReadToEndAsync();\n            Assert.Equal(JsonSerializer.Serialize(bodyParam, options: new JsonSerializerOptions(JsonSerializerDefaults.Web)), body);\n        }\n    }\n\n    public static object?[][] FromServiceOptionality\n    {\n        get\n        {\n            var requiredExplicitService = $\"\"\"\n            void requiredExplicitService([{typeof(FromServiceAttribute)}]{typeof(MyService)} service, HttpContext httpContext) => httpContext.Items.Add(\"service\", service);\n            app.MapGet(\"/\", requiredExplicitService);\n            \"\"\";\n            var defaultValueExplicitServiceParam = $\"\"\"\n            void defaultValueExplicitServiceParam(HttpContext httpContext, [{typeof(FromServiceAttribute)}]{typeof(MyService)}? service = null) => httpContext.Items.Add(\"service\", service);\n            app.MapGet(\"/\", defaultValueExplicitServiceParam);\n            \"\"\";\n            var nullableExplicitServiceParam = $\"\"\"\n            app.MapGet(\"/\", (HttpContext httpContext, [{typeof(FromServiceAttribute)}]{typeof(MyService)}? service) => httpContext.Items.Add(\"service\", service));\n            \"\"\";\n\n            return new []\n                {\n                    new object?[] { requiredExplicitService, false, false},\n                    new object?[] { requiredExplicitService, true, true},\n\n                    new object?[] { defaultValueExplicitServiceParam, false, true},\n                    new object?[] { defaultValueExplicitServiceParam, true, true},\n\n                    new object?[] { nullableExplicitServiceParam, false, true},\n                    new object?[] { nullableExplicitServiceParam, true, true},\n                };\n        }\n    }\n\n    [Theory]\n    [MemberData(nameof(FromServiceOptionality))]\n    public async Task HandleFromServiceOptionality(string source, bool hasService, bool isValid)\n    {\n        var myOriginalService = new MyService();\n\n        var serviceCollection = new ServiceCollection();\n        serviceCollection.AddSingleton(myOriginalService);\n        serviceCollection.AddSingleton<IMyService>(myOriginalService);\n        var services = serviceCollection.BuildServiceProvider();\n\n        var requestDelegate = await GetRequestDelegate(source, hasService ? services : null) ;\n\n        using var requestScoped = services.CreateScope();\n\n        var httpContext = new DefaultHttpContext\n        {\n            RequestServices = hasService ? requestScoped.ServiceProvider : new ServiceCollection().BuildServiceProvider()\n        };\n\n        if (isValid)\n        {\n            await requestDelegate(httpContext);\n            Assert.Same(hasService ? myOriginalService : null, httpContext.Items[\"service\"]);\n            Assert.Equal(200,httpContext.Response.StatusCode);\n        }\n        else\n        {\n            await Assert.ThrowsAsync<InvalidOperationException>(() => requestDelegate(httpContext));\n            Assert.False(httpContext.RequestAborted.IsCancellationRequested);\n        }\n    }\n    \n    public static IEnumerable<object?[]> BindAsyncOptionality\n    {\n        get\n        {\n            var requiredReferenceType = $\"\"\"\n            app.MapPost(\"/1\", (HttpContext context, {typeof(MyBindAsyncRecord)} myBindAsyncRecord) => context.Items[\"uri\"] = myBindAsyncRecord.Uri);\n            \"\"\";\n            var defaultReferenceType = $\"\"\"\n            void defaultReferenceTypeHandler(HttpContext context, {typeof(MyBindAsyncRecord)}? myBindAsyncRecord = null) => context.Items[\"uri\"] = myBindAsyncRecord?.Uri;\n            app.MapPost(\"/2\", defaultReferenceTypeHandler);\n            \"\"\";\n            var nullableReferenceType = $\"\"\"\n            app.MapPost(\"/3\", (HttpContext context, {typeof(MyBindAsyncRecord)}? myBindAsyncRecord) => context.Items[\"uri\"] = myBindAsyncRecord?.Uri);\n            \"\"\";\n            var requiredReferenceTypeSimple = $\"\"\"\n            app.MapPost(\"/4\", (HttpContext context, {typeof(MySimpleBindAsyncRecord)} mySimpleBindAsyncRecord) => context.Items[\"uri\"] = mySimpleBindAsyncRecord.Uri);\n            \"\"\";\n            var requiredValueType = $\"\"\"\n            app.MapPost(\"/5\", (HttpContext context, {typeof(MyNullableBindAsyncStruct)} myNullableBindAsyncStruct) => context.Items[\"uri\"] = myNullableBindAsyncStruct.Uri);\n            \"\"\";\n            var defaultValueType = $\"\"\"\n            void defaultValueTypeHandler(HttpContext context, {typeof(MyNullableBindAsyncStruct)}? myNullableBindAsyncStruct = null) => context.Items[\"uri\"] = myNullableBindAsyncStruct?.Uri;\n            app.MapPost(\"/6\", defaultValueTypeHandler);\n            \"\"\";\n            var nullableValueType = $\"\"\"\n            app.MapPost(\"/7\", (HttpContext context, {typeof(MyNullableBindAsyncStruct)}? myNullableBindAsyncStruct) => context.Items[\"uri\"] = myNullableBindAsyncStruct?.Uri);\n            \"\"\";\n            var requiredValueTypeSimple = $\"\"\"\n            app.MapPost(\"/8\", (HttpContext context, {typeof(MySimpleBindAsyncStruct)} mySimpleBindAsyncStruct) => context.Items[\"uri\"] = mySimpleBindAsyncStruct.Uri);\n            \"\"\";\n\n            return new object?[][]\n            {\n                    new object?[] { requiredReferenceType, false, true, false },\n                    new object?[] { requiredReferenceType, true, false, false, },\n                    new object?[] { requiredReferenceTypeSimple, true, false, false },\n                    \n                    new object?[] { defaultReferenceType, false, false, false, },\n                    new object?[] { defaultReferenceType, true, false, false },\n                    \n                    new object?[] { nullableReferenceType, false, false, false },\n                    new object?[] { nullableReferenceType, true, false, false },\n\n                    new object?[] { requiredValueType, false, true, true },\n                    new object?[] { requiredValueType, true, false, true },\n                    new object?[] { requiredValueTypeSimple, true, false, true },\n\n                    new object?[] { defaultValueType, false, false, true },\n                    new object?[] { defaultValueType, true, false, true },\n                    \n                    new object?[] { nullableValueType, false, false, true },\n                    new object?[] { nullableValueType, true, false, true },\n            };\n        }\n    }\n    \n    [Theory]\n    [MemberData(nameof(BindAsyncOptionality))]\n    public async Task HandleBindAsyncOptionality(string source, bool includeReferer, bool isInvalid, bool isStruct)\n    {\n        // Arrange\n        var requestDelegate = await GetRequestDelegate(source);\n        var httpContext = new DefaultHttpContext();\n        if (includeReferer)\n        {\n            httpContext.Request.Headers.Referer = \"https://example.org\";\n        }\n\n        // Assert\n        if (!isInvalid)\n        {\n            await requestDelegate(httpContext);\n            Assert.Equal(200, httpContext.Response.StatusCode);\n\n            if (includeReferer)\n            {\n                Assert.Equal(new Uri(\"https://example.org\"), httpContext.Items[\"uri\"]);\n            }\n            else\n            {\n                Assert.Null(httpContext.Items[\"uri\"]);\n            }\n        }\n        else\n        {\n            await requestDelegate(httpContext);\n            Assert.Equal(400, httpContext.Response.StatusCode);\n            Assert.False(httpContext.RequestAborted.IsCancellationRequested);\n        }\n    }\n\n    [Theory]\n    [InlineData(\"\"\"app.MapGet(\"/multiple-nn\", (Microsoft.Extensions.Primitives.StringValues queries) => queries);\"\"\")]\n    [InlineData(\"\"\"app.MapGet(\"/multiple-n\", (Microsoft.Extensions.Primitives.StringValues? queries) => queries);\"\"\")]\n    public async Task HandleQueryHandlerTypeDifferentFromResolved(string source)\n    {\n        var requestDelegate = await GetRequestDelegate(source);\n\n        var httpContext = new DefaultHttpContext();\n\n        await requestDelegate(httpContext);\n    }\n    \n    public async Task<Endpoint> GetEndpoint(string source, IServiceProvider? serviceProvider = null)\n    {\n        // Act\n        var (results, compilation) = await RunGenerator(source);\n\n        // Assert\n        Assert.Empty(results.Diagnostics);\n\n        var builderFunc = CreateInvocationFromCompilation(compilation);\n        var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider ?? new EmptyServiceProvider()));\n        _ = builderFunc(builder);\n\n        var dataSource = Assert.Single(builder.DataSources);\n        // Trigger Endpoint build by calling getter.\n        var endpoint = Assert.Single(dataSource.Endpoints);\n\n        var sourceKeyMetadata = endpoint.Metadata.GetMetadata<SourceKey>();\n        Assert.NotNull(sourceKeyMetadata);\n\n        return endpoint;\n    }\n\n    private async Task<RequestDelegate> GetRequestDelegate(string source, IServiceProvider? serviceProvider = null)\n    {\n        var endpoint = await GetEndpoint(source, serviceProvider);\n        Assert.NotNull(endpoint.RequestDelegate);\n        return endpoint.RequestDelegate;\n    }\n\n    private static async Task AssertEndpointBehavior(\n        Endpoint endpoint,\n        string expectedResponse,\n        int expectedStatusCode,\n        IServiceProvider? serviceProvider = null,\n        RouteValueDictionary? routeValues = null,\n        QueryString? query = null)\n    {\n        var httpContext = new DefaultHttpContext();\n        IServiceScope? scope = null;\n\n        if (serviceProvider is not null)\n        {\n            scope = serviceProvider.CreateScope();\n            httpContext.RequestServices = scope.ServiceProvider;\n        }\n\n        var outStream = new MemoryStream();\n        httpContext.Response.Body = outStream;\n\n        if (query is { } q)\n        {\n            httpContext.Request.QueryString = q;\n        }\n\n        if (routeValues is not null)\n        {\n            httpContext.Request.RouteValues = routeValues;\n        }\n\n        Assert.NotNull(endpoint.RequestDelegate);\n        await endpoint.RequestDelegate(httpContext);\n\n        var httpResponse = httpContext.Response;\n        httpResponse.Body.Seek(0, SeekOrigin.Begin);\n        var streamReader = new StreamReader(httpResponse.Body);\n        var body = await streamReader.ReadToEndAsync();\n        Assert.Equal(expectedStatusCode, httpContext.Response.StatusCode);\n        Assert.Equal(expectedResponse, body);\n\n        scope?.Dispose();\n    }\n\n    private static Func<IEndpointRouteBuilder, IEndpointRouteBuilder> CreateInvocationFromCompilation(Compilation compilation)\n    {\n        var assemblyName = compilation.AssemblyName!;\n        var symbolsName = Path.ChangeExtension(assemblyName, \"pdb\");\n\n        var output = new MemoryStream();\n        var pdb = new MemoryStream();\n\n        var emitOptions = new EmitOptions(\n                        debugInformationFormat: DebugInformationFormat.PortablePdb,\n                        pdbFilePath: symbolsName);\n\n        var embeddedTexts = new List<EmbeddedText>();\n\n        // Make sure we embed the sources in pdb for easy debugging\n        foreach (var syntaxTree in compilation.SyntaxTrees)\n        {\n            var text = syntaxTree.GetText();\n            var encoding = text.Encoding ?? Encoding.UTF8;\n            var buffer = encoding.GetBytes(text.ToString());\n            var sourceText = SourceText.From(buffer, buffer.Length, encoding, canBeEmbedded: true);\n\n            var syntaxRootNode = (CSharpSyntaxNode)syntaxTree.GetRoot();\n            var newSyntaxTree = CSharpSyntaxTree.Create(syntaxRootNode, options: null, encoding: encoding, path: syntaxTree.FilePath);\n\n            compilation = compilation.ReplaceSyntaxTree(syntaxTree, newSyntaxTree);\n\n            embeddedTexts.Add(EmbeddedText.FromSource(syntaxTree.FilePath, sourceText));\n        }\n\n        var result = compilation.Emit(output, pdb, options: emitOptions, embeddedTexts: embeddedTexts);\n\n        Assert.Empty(result.Diagnostics.Where(d => d.Severity > DiagnosticSeverity.Warning));\n        Assert.True(result.Success);\n\n        output.Position = 0;\n        pdb.Position = 0;\n\n        var assembly = AssemblyLoadContext.Default.LoadFromStream(output, pdb);\n        var handler = assembly?.GetType(\"TestMapActions\")\n                       ?.GetMethod(\"MapTestEndpoints\", BindingFlags.Public | BindingFlags.Static)\n                       ?.CreateDelegate<Func<IEndpointRouteBuilder, IEndpointRouteBuilder>>();\n\n        Assert.NotNull(handler);\n        return handler;\n    }\n\n    private static async Task<(GeneratorRunResult, Compilation)> RunGenerator(string mapAction)\n    {\n        var project = CreateProject();\n        var source = $$\"\"\"\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Routing;\n\npublic static class TestMapActions\n{\n    public static IEndpointRouteBuilder MapTestEndpoints(this IEndpointRouteBuilder app)\n    {\n        {{mapAction}}\n        return app;\n    }\n}\n\"\"\";\n        project = project.AddDocument(\"TestMapActions.cs\", SourceText.From(source, Encoding.UTF8)).Project;\n        var compilation = await project.GetCompilationAsync();\n\n        GeneratorDriver driver = CSharpGeneratorDriver.Create(new[] { new uControllerGenerator() },\n            parseOptions: (CSharpParseOptions)project.ParseOptions!);\n\n        Assert.NotNull(compilation);\n\n        driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var outputCompilation, out var _);\n\n        var results = driver.GetRunResult();\n        var diagnostics = outputCompilation.GetDiagnostics();\n        Assert.Empty(diagnostics.Where(d => d.Severity > DiagnosticSeverity.Warning));\n        return (results.Results[0], outputCompilation);\n    }\n\n    private static Project CreateProject()\n    {\n        var projectName = $\"TestProject-{Guid.NewGuid()}\";\n        var projectId = ProjectId.CreateNewId(projectName);\n\n        var solution = new AdhocWorkspace()\n           .CurrentSolution\n           .AddProject(projectId, projectName, projectName, LanguageNames.CSharp);\n\n        var project = solution.Projects.Single()\n            .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)\n            .WithNullableContextOptions(NullableContextOptions.Enable))\n            .WithParseOptions(new CSharpParseOptions(LanguageVersion.CSharp11).WithPreprocessorSymbols(\"NET7_0_OR_GREATER\"));\n\n        var resolver = new AppLocalResolver();\n        var dependencyContext = DependencyContext.Load(typeof(IntegrationTests).Assembly);\n\n        Assert.NotNull(dependencyContext);\n\n        foreach (var defaultCompileLibrary in dependencyContext.CompileLibraries)\n        {\n            foreach (var resolveReferencePath in defaultCompileLibrary.ResolveReferencePaths(resolver))\n            {\n                // Skip the source generator itself\n                if (resolveReferencePath.Equals(typeof(uControllerGenerator).Assembly.Location))\n                {\n                    continue;\n                }\n\n                project = project.AddMetadataReference(MetadataReference.CreateFromFile(resolveReferencePath));\n            }\n        }\n\n        return project;\n    }\n\n    private class RequestBodyDetectionFeature : IHttpRequestBodyDetectionFeature\n    {\n        public RequestBodyDetectionFeature(bool canHaveBody)\n        {\n            CanHaveBody = canHaveBody;\n        }\n\n        public bool CanHaveBody { get; }\n    }\n\n    private static IEndpointRouteBuilder CreateEndpointBuilder(IServiceProvider? serviceProvider = null)\n    {\n        return new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider ?? new EmptyServiceProvider()));\n    }\n\n    private class AppLocalResolver : ICompilationAssemblyResolver\n    {\n        public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string>? assemblies)\n        {\n            foreach (var assembly in library.Assemblies)\n            {\n                var dll = Path.Combine(Directory.GetCurrentDirectory(), \"refs\", Path.GetFileName(assembly));\n                if (File.Exists(dll))\n                {\n                    assemblies ??= new();\n                    assemblies.Add(dll);\n                    return true;\n                }\n\n                dll = Path.Combine(Directory.GetCurrentDirectory(), Path.GetFileName(assembly));\n                if (File.Exists(dll))\n                {\n                    assemblies ??= new();\n                    assemblies.Add(dll);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    }\n\n    private class EmptyServiceProvider : IServiceScope, IServiceProvider, IServiceScopeFactory\n    {\n        public IServiceProvider ServiceProvider => this;\n\n        public RouteHandlerOptions RouteHandlerOptions { get; set; } = new RouteHandlerOptions();\n\n        public IServiceScope CreateScope()\n        {\n            return this;\n        }\n\n        public void Dispose() { }\n\n        public object? GetService(Type serviceType)\n        {\n            return null;\n        }\n    }\n\n    private class DefaultEndpointRouteBuilder : IEndpointRouteBuilder\n    {\n        public DefaultEndpointRouteBuilder(IApplicationBuilder applicationBuilder)\n        {\n            ApplicationBuilder = applicationBuilder ?? throw new ArgumentNullException(nameof(applicationBuilder));\n            DataSources = new List<EndpointDataSource>();\n        }\n\n        public IApplicationBuilder ApplicationBuilder { get; }\n\n        public IApplicationBuilder CreateApplicationBuilder() => ApplicationBuilder.New();\n\n        public ICollection<EndpointDataSource> DataSources { get; }\n\n        public IServiceProvider ServiceProvider => ApplicationBuilder.ApplicationServices;\n    }\n}"
  },
  {
    "path": "test/uController.SourceGenerator.Tests/SharedTypes.cs",
    "content": "﻿using System.Text.Json.Serialization;\nusing System.Text.Json;\nusing Microsoft.AspNetCore.Http.Metadata;\n\nnamespace uController.SourceGenerator.Tests;\n\n// Types shared between the tests and compilation. They *must* be public.\n\npublic class FromServiceAttribute : Attribute, IFromServiceMetadata\n{\n}\n\npublic class FromBodyAttribute : Attribute, IFromBodyMetadata\n{\n    public bool AllowEmpty { get; set; }\n}\n\npublic interface IMyService\n{\n}\n\npublic class MyService : IMyService\n{\n}\npublic class TodoService\n{\n\n}\n\npublic record MyBindAsyncRecord(Uri Uri)\n{\n    public static ValueTask<MyBindAsyncRecord?> BindAsync(HttpContext context, ParameterInfo parameter)\n    {\n        Assert.Equal(typeof(MyBindAsyncRecord), parameter.ParameterType);\n        Assert.StartsWith(\"myBindAsyncRecord\", parameter.Name);\n\n        if (!Uri.TryCreate(context.Request.Headers.Referer, UriKind.Absolute, out var uri))\n        {\n            return new(result: null);\n        }\n\n        return new(result: new(uri));\n    }\n\n    // BindAsync(HttpContext, ParameterInfo) should be preferred over TryParse(string, ...) if there's\n    // no [FromRoute] or [FromQuery] attributes.\n    public static bool TryParse(string? value, out MyBindAsyncRecord? result) =>\n        throw new NotImplementedException();\n}\n\npublic record MySimpleBindAsyncRecord(Uri Uri)\n{\n    public static ValueTask<MySimpleBindAsyncRecord?> BindAsync(HttpContext context)\n    {\n        if (!Uri.TryCreate(context.Request.Headers.Referer, UriKind.Absolute, out var uri))\n        {\n            return new(result: null);\n        }\n\n        return new(result: new(uri));\n    }\n}\n\npublic record struct MyNullableBindAsyncStruct(Uri Uri)\n{\n    public static ValueTask<MyNullableBindAsyncStruct?> BindAsync(HttpContext context, ParameterInfo parameter)\n    {\n        Assert.True(parameter.ParameterType == typeof(MyNullableBindAsyncStruct) || parameter.ParameterType == typeof(MyNullableBindAsyncStruct?));\n        Assert.Equal(\"myNullableBindAsyncStruct\", parameter.Name);\n\n        if (!Uri.TryCreate(context.Request.Headers.Referer, UriKind.Absolute, out var uri))\n        {\n            return new(result: null);\n        }\n\n        return new(result: new(uri));\n    }\n}\n\npublic record struct MySimpleBindAsyncStruct(Uri Uri)\n{\n    public static ValueTask<MySimpleBindAsyncStruct> BindAsync(HttpContext context)\n    {\n        if (!Uri.TryCreate(context.Request.Headers.Referer, UriKind.Absolute, out var uri))\n        {\n            throw new BadHttpRequestException(\"The request is missing the required Referer header.\");\n        }\n\n        return new(result: new(uri));\n    }\n}\n\npublic interface ITodo\n{\n    public int Id { get; }\n    public string? Name { get; }\n    public bool IsComplete { get; }\n}\n\npublic class Todo : ITodo\n{\n    public int Id { get; set; }\n    public string? Name { get; set; } = \"Todo\";\n    public bool IsComplete { get; set; }\n}\n\npublic record struct TodoStruct(int Id, string? Name, bool IsComplete) : ITodo;\n\npublic class TodoJsonConverter : JsonConverter<ITodo>\n{\n    public override ITodo? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)\n    {\n        var todo = new Todo();\n        while (reader.Read())\n        {\n            if (reader.TokenType == JsonTokenType.EndObject)\n            {\n                break;\n            }\n\n            var property = reader.GetString()!;\n            reader.Read();\n\n            switch (property.ToLowerInvariant())\n            {\n                case \"id\":\n                    todo.Id = reader.GetInt32();\n                    break;\n                case \"name\":\n                    todo.Name = reader.GetString();\n                    break;\n                case \"iscomplete\":\n                    todo.IsComplete = reader.GetBoolean();\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        return todo;\n    }\n\n    public override void Write(Utf8JsonWriter writer, ITodo value, JsonSerializerOptions options)\n    {\n        throw new NotImplementedException();\n    }\n}"
  },
  {
    "path": "test/uController.SourceGenerator.Tests/SourceKey.cs",
    "content": "﻿namespace Microsoft.AspNetCore.Builder\n{\n    public record SourceKey(string Path, int Line);\n}"
  },
  {
    "path": "test/uController.SourceGenerator.Tests/Usings.cs",
    "content": "﻿global using System;\nglobal using System.Collections.Generic;\nglobal using System.IO;\nglobal using System.Linq;\nglobal using System.Reflection;\nglobal using System.Runtime.Loader;\nglobal using System.Text;\nglobal using System.Threading.Tasks;\nglobal using Microsoft.AspNetCore.Builder;\nglobal using Microsoft.AspNetCore.Http;\nglobal using Microsoft.AspNetCore.Routing;\nglobal using Microsoft.CodeAnalysis;\nglobal using Microsoft.CodeAnalysis.CSharp;\nglobal using Microsoft.CodeAnalysis.Text;\nglobal using Microsoft.Extensions.DependencyInjection;\nglobal using Microsoft.Extensions.DependencyModel;\nglobal using Microsoft.Extensions.DependencyModel.Resolution;\nglobal using Xunit;\nglobal using Xunit.Abstractions;\n"
  },
  {
    "path": "test/uController.SourceGenerator.Tests/uController.SourceGenerator.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n\t<PropertyGroup>\n\t\t<TargetFramework>net7.0</TargetFramework>\n\t\t<Nullable>enable</Nullable>\n\t\t<IsPackable>false</IsPackable>\n\t\t<PreserveCompilationContext>true</PreserveCompilationContext>\n\t</PropertyGroup>\n\n\t<ItemGroup>\n\t\t<PackageReference Include=\"Microsoft.CodeAnalysis\" Version=\"4.4.0-4.final\" />\n\t\t<PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"4.4.0-4.final\" />\n\t\t<PackageReference Include=\"Microsoft.Extensions.Hosting.Abstractions\" Version=\"7.0.0\" />\n\t\t<PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.11.0\" />\n\t\t<PackageReference Include=\"MinimalApis.Extensions\" Version=\"0.9.0-pre.20221011.36\" />\n\t\t<PackageReference Include=\"Moq\" Version=\"4.18.2\" />\n\t\t<PackageReference Include=\"xunit\" Version=\"2.4.2\" />\n\t\t<PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.5\">\n\t\t\t<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n\t\t\t<PrivateAssets>all</PrivateAssets>\n\t\t</PackageReference>\n\t\t<PackageReference Include=\"coverlet.collector\" Version=\"3.1.0\">\n\t\t\t<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n\t\t\t<PrivateAssets>all</PrivateAssets>\n\t\t</PackageReference>\n\t\t<PackageReference Include=\"Microsoft.AspNetCore.Mvc.Testing\" Version=\"7.0.0-*\" />\n\t\t<PackageReference Include=\"Microsoft.CodeAnalysis.Features\" Version=\"4.4.0-4.final\" />\n\t\t<FrameworkReference Include=\"Microsoft.AspNetCore.App\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t\t<ProjectReference Include=\"..\\..\\src\\uController.SourceGenerator\\uController.SourceGenerator.csproj\" />\n\t</ItemGroup>\n\n\t<ItemGroup>\n\t  <PackageReference Update=\"Microsoft.SourceLink.GitHub\" Version=\"1.1.1\" />\n\t</ItemGroup>\n\n</Project>"
  },
  {
    "path": "uController.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.4.32728.343\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Sample\", \"samples\\Sample.csproj\", \"{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9}\"\r\nEndProject\r\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"uController.SourceGenerator\", \"src\\uController.SourceGenerator\\uController.SourceGenerator.csproj\", \"{045C64E7-5639-4ECD-BEE3-57597E7CF77E}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{9AC9FBC2-655D-4D1C-B3B0-8429140C1125}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"samples\", \"samples\", \"{37EABDC7-EC04-40DB-AADB-73232A885C63}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{F0473E60-E67C-4908-97BE-6F37C6EC9A48}\"\r\n\tProjectSection(SolutionItems) = preProject\r\n\t\tREADME.md = README.md\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"test\", \"test\", \"{23D17AAC-308D-48E4-9F5F-6B60322BFF9A}\"\r\nEndProject\r\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"uController.SourceGenerator.Tests\", \"test\\uController.SourceGenerator.Tests\\uController.SourceGenerator.Tests.csproj\", \"{6EB60A4E-87BA-472D-997E-D4C0361A2489}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{045C64E7-5639-4ECD-BEE3-57597E7CF77E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{045C64E7-5639-4ECD-BEE3-57597E7CF77E}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{045C64E7-5639-4ECD-BEE3-57597E7CF77E}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{045C64E7-5639-4ECD-BEE3-57597E7CF77E}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{6EB60A4E-87BA-472D-997E-D4C0361A2489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{6EB60A4E-87BA-472D-997E-D4C0361A2489}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{6EB60A4E-87BA-472D-997E-D4C0361A2489}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{6EB60A4E-87BA-472D-997E-D4C0361A2489}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(NestedProjects) = preSolution\r\n\t\t{E75EECDA-E740-454B-BA83-7B7AC0D9E0A9} = {37EABDC7-EC04-40DB-AADB-73232A885C63}\r\n\t\t{045C64E7-5639-4ECD-BEE3-57597E7CF77E} = {9AC9FBC2-655D-4D1C-B3B0-8429140C1125}\r\n\t\t{6EB60A4E-87BA-472D-997E-D4C0361A2489} = {23D17AAC-308D-48E4-9F5F-6B60322BFF9A}\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {2D65BA78-C9A7-43A5-91EC-5237C4B9E5C4}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "version.json",
    "content": "{\n    \"$schema\": \"https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json\",\n    \"version\": \"0.2-alpha\",\n    \"nugetPackageVersion\": {\n        \"semVer\": 2 \n    }\n  }"
  }
]