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
35 changes: 35 additions & 0 deletions src/NJsonSchema.CodeGeneration.CSharp.Tests/EnumTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,41 @@ public async Task When_enum_name_contains_colon_then_it_is_removed_and_next_word
CSharpCompiler.AssertCompile(code);
}

[Theory]
[InlineData(false)]
[InlineData(true)]
public async Task When_enum_is_string_then_generic_StringEnumConverter_is_used(bool nullable)
{
// Arrange
var json =
$$"""
{
"type": "object",
"additionalProperties": false,
"properties": {
"size" : {
"type": [ "string"{{(nullable ? ", \"null\"" : "")}} ],
"enum" : [
"small",
"medium",
"large"
]
}
}
}
""";

var schema = await JsonSchema.FromJsonAsync(json);
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { JsonLibrary = CSharpJsonLibrary.SystemTextJson });

// Act
var code = generator.GenerateFile("MyClass");

// Assert
await VerifyHelper.Verify(code);
CSharpCompiler.AssertCompile(code);
}

public class MyStringEnumListTest
{
public List<MyStringEnum> Enums { get; set; }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//----------------------
// <auto-generated>
// </auto-generated>
//----------------------


namespace MyNamespace
{
#pragma warning disable // Disable all warnings

public partial class MyClass
{

[System.Text.Json.Serialization.JsonPropertyName("size")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<MyClassSize>))]
public MyClassSize Size { get; set; }

}

public enum MyClassSize
{

[System.Runtime.Serialization.EnumMember(Value = @"small")]
Small = 0,


[System.Runtime.Serialization.EnumMember(Value = @"medium")]
Medium = 1,


[System.Runtime.Serialization.EnumMember(Value = @"large")]
Large = 2,


}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//----------------------
// <auto-generated>
// </auto-generated>
//----------------------


namespace MyNamespace
{
#pragma warning disable // Disable all warnings

public partial class MyClass
{

[System.Text.Json.Serialization.JsonPropertyName("size")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<MyClassSize>))]
public MyClassSize? Size { get; set; }

}

public enum MyClassSize
{

[System.Runtime.Serialization.EnumMember(Value = @"small")]
Small = 0,


[System.Runtime.Serialization.EnumMember(Value = @"medium")]
Medium = 1,


[System.Runtime.Serialization.EnumMember(Value = @"large")]
Large = 2,


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
{%- endif -%}
{%- if property.IsStringEnum -%}
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter))]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<{{ property.Type | rtrimquestionmark }}>))]
{%- else -%}
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
{%- endif -%}
Expand Down
7 changes: 7 additions & 0 deletions src/NJsonSchema.CodeGeneration/DefaultTemplateFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, Assembly[] ass
templateOptions.Filters.AddFilter("lowercamelcase", LiquidFilters.Lowercamelcase);
templateOptions.Filters.AddFilter("uppercamelcase", LiquidFilters.Uppercamelcase);
templateOptions.Filters.AddFilter("literal", LiquidFilters.Literal);
templateOptions.Filters.AddFilter("rtrimquestionmark", LiquidFilters.RightTrimQuestionMark);

TemplateOptions = templateOptions;
}
Expand Down Expand Up @@ -331,6 +332,12 @@ public static ValueTask<FluidValue> Literal(FluidValue input, FilterArguments ar
var converted = ConversionUtilities.ConvertToStringLiteral(input.ToStringValue(), "\"", "\"");
return new ValueTask<FluidValue>(new StringValue(converted, encode: false));
}

public static ValueTask<FluidValue> RightTrimQuestionMark(FluidValue input, FilterArguments arguments, TemplateContext context)
{
var converted = input.ToStringValue().TrimEnd('?');
return new ValueTask<FluidValue>(new StringValue(converted, encode: false));
}
}

/// <summary>
Expand Down
Loading