Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<OpenApiAbstractionsVersion>0.3.0</OpenApiAbstractionsVersion>
<OpenApiJsonExtensionsVersion>0.18.0</OpenApiJsonExtensionsVersion>
<OpenApiLoadersVersion>0.2.0</OpenApiLoadersVersion>
<OpenApiCSharpVersion>0.25.2</OpenApiCSharpVersion>
<OpenApiCSharpVersion>0.25.3</OpenApiCSharpVersion>
<OpenApiTypeScriptClientVersion>0.12.2</OpenApiTypeScriptClientVersion>
<OpenApiTypeScriptRxjsClientVersion>0.9.0</OpenApiTypeScriptRxjsClientVersion>
<OpenApiTypeScriptMswVersion>0.9.0</OpenApiTypeScriptMswVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public override void Visit(OpenApiOperation operation, string httpMethod, Argume
public override void Visit(OpenApiParameter param, Argument argument)
{
var info = param.Schema?.ResolveSchemaInfo();
var dataType = inlineSchemas.ToInlineDataType(param.Schema) ?? CSharpInlineSchemas.AnyObject;
var dataType = inlineSchemas.SafeToInlineDataType(param.Schema, argument.Diagnostic) ?? CSharpInlineSchemas.AnyObject;
argument.Builder?.SharedParameters.Add(new OperationParameter(
RawName: param.Name,
ParamName: CSharpNaming.ToParameterName(param.Name, options.ReservedIdentifiers()),
Expand Down Expand Up @@ -133,7 +133,7 @@ public override void Visit(OpenApiResponse response, int? statusCode, Argument a
Description: response.Description,
Content: (from entry in (from c in content ?? Enumerable.Empty<KeyValuePair<string, OpenApiMediaTypeObject>>()
select (c.Key, c.Value.Schema)).DefaultIfEmpty((Key: "", Schema: null))
let dataType = entry.Schema != null ? inlineSchemas.ToInlineDataType(entry.Schema) : null
let dataType = entry.Schema != null ? inlineSchemas.SafeToInlineDataType(entry.Schema, argument.Diagnostic) : null
where entry.Key != "application/xml" // exclude xml, since we don't support it
select new OperationResponseContentOption(
MediaType: entry.Key,
Expand All @@ -143,7 +143,7 @@ public override void Visit(OpenApiResponse response, int? statusCode, Argument a
Headers: (from entry in response.Headers
let required = entry.Required
let info = entry.Schema?.ResolveSchemaInfo()
let dataType = inlineSchemas.ToInlineDataType(entry.Schema)
let dataType = inlineSchemas.SafeToInlineDataType(entry.Schema, argument.Diagnostic)
select new OperationResponseHeader(
RawName: entry.Name,
ParamName: CSharpNaming.ToParameterName("header " + entry.Name, options.ReservedIdentifiers()),
Expand Down Expand Up @@ -183,7 +183,7 @@ IEnumerable<OperationParameter> GetFormParams() =>
from param in mediaTypeSchemaInfo?.TryGetAnnotation<PropertiesKeyword>()?.Properties
let required = mediaTypeSchemaInfo?.TryGetAnnotation<RequiredKeyword>()?.RequiredProperties.Contains(param.Key) ?? false
let info = param.Value?.ResolveSchemaInfo()
let dataType = inlineSchemas.ToInlineDataType(param.Value)
let dataType = inlineSchemas.SafeToInlineDataType(param.Value, argument.Diagnostic)
select new OperationParameter(
RawName: param.Key,
ParamName: CSharpNaming.ToParameterName(param.Key, options.ReservedIdentifiers()),
Expand All @@ -207,7 +207,7 @@ IEnumerable<OperationParameter> GetFormParams() =>
IEnumerable<OperationParameter> GetStandardParams() =>
from ct in new[] { mediaType }
let info = ct.Schema?.ResolveSchemaInfo()
let dataType = inlineSchemas.ToInlineDataType(ct.Schema)
let dataType = inlineSchemas.SafeToInlineDataType(ct.Schema, argument.Diagnostic)
select new OperationParameter(
RawName: null,
ParamName: CSharpNaming.ToParameterName(argument.Builder?.Operation.OperationId + " body", options.ReservedIdentifiers()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using DarkPatterns.OpenApiCodegen.Handlebars;
using DarkPatterns.OpenApi.CSharp;
using DarkPatterns.OpenApiCodegen.CSharp.MvcServer.Templates;
using DarkPatterns.Json.Diagnostics;

namespace DarkPatterns.OpenApiCodegen.CSharp.MvcServer;

Expand All @@ -21,7 +22,16 @@ public SourceEntry TransformController(string groupName, OperationGroupData grou
var resultOperations = new List<ControllerOperation>();
var visitor = new ControllerOperationVisitor(settings.SchemaRegistry, options, controllerClassName: className);
foreach (var (operation, method, path) in operations)
visitor.Visit(operation, method, new ControllerOperationVisitor.Argument(diagnostic, resultOperations.Add, CurrentPath: path));
{
try
{
visitor.Visit(operation, method, new ControllerOperationVisitor.Argument(diagnostic, resultOperations.Add, CurrentPath: path));
}
catch (Exception ex)
{
diagnostic.Diagnostics.AddRange(ex.ToDiagnostics(settings.SchemaRegistry.DocumentRegistry, operation.Metadata));
}
}

var template = new Templates.ControllerTemplate(
Header: settings.Header(document.Id),
Expand Down
30 changes: 28 additions & 2 deletions lib/OpenApi.CSharp/CSharpInlineSchemas.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,33 @@ public class CSharpInlineSchemas(CSharpSchemaOptions options, DocumentRegistry d
public CSharpInlineDefinition? ToInlineDataType(JsonSchema? schema)
{
if (schema == null) return null;
return ToInlineDataType(schema.ResolveSchemaInfo());
try
{
return ToInlineDataType(schema.ResolveSchemaInfo());
}
catch (Exception ex)
{
throw new MultipleDiagnosticException([
.. ex.ToDiagnostics(documentRegistry, schema.Metadata),
]);
}
}

[return: System.Diagnostics.CodeAnalysis.NotNullIfNotNull(nameof(schema))]
public CSharpInlineDefinition? SafeToInlineDataType(JsonSchema? schema, OpenApiTransformDiagnostic diagnostic)
{
if (schema == null) return null;
try
{
return ToInlineDataType(schema.ResolveSchemaInfo());
}
catch (Exception ex)
{
diagnostic.Diagnostics.AddRange([
.. ex.ToDiagnostics(documentRegistry, schema.Metadata),
]);
return CSharpInlineSchemas.AnyObject;
}
}

[return: NotNullIfNotNull(nameof(schema))]
Expand Down Expand Up @@ -226,4 +252,4 @@ _ when int.TryParse(statusCode, out var numeric) && HttpStatusCodes.StatusCodeNa
};
}
}
}
}
2 changes: 1 addition & 1 deletion lib/OpenApi.CSharp/CSharpSchemaSourceProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ private Templates.ObjectModel ToObjectModel(string className, JsonSchemaInfo sch

Templates.ModelVar[] vars = (from entry in properties
let req = required.Contains(entry.Key)
let dataType = inlineSchemas.ToInlineDataType(entry.Value.EffectiveSchema)
let dataType = inlineSchemas.SafeToInlineDataType(entry.Value.EffectiveSchema, diagnostic)
let resolved = objectModel.LegacyOptionalBehavior && !req ? dataType.MakeNullable() : dataType
select new Templates.ModelVar(
BaseName: entry.Key,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,10 @@ public void Reports_diagnostics_for_bad_2_yaml()
{
Assert.IsType<UnableToCreateInlineSchemaDiagnostic>(diag);
Assert.Equal("proj://embedded/bad.2.yaml", diag.Location.RetrievalUri.OriginalString);
Assert.Equal(16, diag.Location.Range?.Start.Line);
Assert.Equal(17, diag.Location.Range?.Start.Column);
Assert.Equal(18, diag.Location.Range?.Start.Line);
Assert.Equal(25, diag.Location.Range?.Start.Column);
Assert.Equal(18, diag.Location.Range?.End.Line);
Assert.Equal(55, diag.Location.Range?.End.Column);
}
);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/TestApp.Bad/OpenApiCodegen.Server.Mvc.TestApp.Bad.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
</PropertyGroup>

<ItemGroup>
<!-- <OpenApiSchemaMvcServer Include="$(SolutionRoot)schemas\bad.yaml" Link="Bad\bad.yaml" PathPrefix="/bad" SchemaId="proj://darkpatterns-openapi/bad.yaml" /> -->
<OpenApiSchemaMvcServer Include="$(SolutionRoot)schemas\bad.2.yaml" Link="Bad\bad.2.yaml" PathPrefix="/bad" SchemaId="proj://darkpatterns-openapi/bad.2.yaml" />
<OpenApiSchemaMvcServer Include="$(SolutionRoot)schemas\bad.yaml" Link="Bad\bad.yaml" PathPrefix="/bad" Namespace="DarkPatterns.OpenApiCodegen.Server.Mvc.TestApp.Bad.Bad" SchemaId="proj://darkpatterns-openapi/bad.yaml" />
<OpenApiSchemaMvcServer Include="$(SolutionRoot)schemas\bad.2.yaml" Link="Bad\bad.2.yaml" PathPrefix="/bad2" Namespace="DarkPatterns.OpenApiCodegen.Server.Mvc.TestApp.Bad.Bad2" SchemaId="proj://darkpatterns-openapi/bad.2.yaml" />

<Compile Remove="generated/**/*" />
<Clean Include="generated/**/*" />
Expand Down