Skip to content

Commit 8cc7d4e

Browse files
committed
fix: remove type casting for strings
1 parent 5db8757 commit 8cc7d4e

File tree

3 files changed

+43
-52
lines changed

3 files changed

+43
-52
lines changed

src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
6868
writer.WriteObject(node as JsonObject);
6969
break;
7070
case JsonValueKind.String: // Primitive
71-
writer.WritePrimitive(node);
71+
writer.WriteValue(node.GetValue<string>());
7272
break;
7373
case JsonValueKind.Number: // Primitive
74-
writer.WritePrimitive(node);
74+
writer.WriteNumber(node);
7575
break;
7676
case JsonValueKind.True or JsonValueKind.False: // Primitive
77-
writer.WritePrimitive(node);
77+
writer.WriteValue(node.GetValue<bool>());
7878
break;
7979
case JsonValueKind.Null: // null
8080
writer.WriteNull();
@@ -109,43 +109,10 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
109109
writer.WriteEndObject();
110110
}
111111

112-
private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitive)
112+
private static void WriteNumber(this IOpenApiWriter writer, JsonNode number)
113113
{
114-
Utils.CheckArgumentNull(writer);
115-
116-
var valueKind = primitive.GetValueKind();
117-
118-
if (valueKind == JsonValueKind.String && primitive is JsonValue jsonStrValue)
114+
if (number is JsonValue jsonValue)
119115
{
120-
if (jsonStrValue.TryGetValue<DateTimeOffset>(out var dto))
121-
{
122-
writer.WriteValue(dto);
123-
}
124-
else if (jsonStrValue.TryGetValue<DateTime>(out var dt))
125-
{
126-
writer.WriteValue(dt);
127-
}
128-
else if (jsonStrValue.TryGetValue<string>(out var strValue))
129-
{
130-
// check whether string is actual string or date time object
131-
if (DateTimeOffset.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset))
132-
{
133-
writer.WriteValue(dateTimeOffset);
134-
}
135-
else if (DateTime.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
136-
{ // order matters, DTO needs to be checked first!!!
137-
writer.WriteValue(dateTime);
138-
}
139-
else
140-
{
141-
writer.WriteValue(strValue);
142-
}
143-
}
144-
}
145-
146-
else if (valueKind == JsonValueKind.Number && primitive is JsonValue jsonValue)
147-
{
148-
149116
if (jsonValue.TryGetValue<decimal>(out var decimalValue))
150117
{
151118
writer.WriteValue(decimalValue);
@@ -167,14 +134,6 @@ private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitiv
167134
writer.WriteValue(intValue);
168135
}
169136
}
170-
else if (valueKind is JsonValueKind.False)
171-
{
172-
writer.WriteValue(false);
173-
}
174-
else if (valueKind is JsonValueKind.True)
175-
{
176-
writer.WriteValue(true);
177-
}
178137
}
179138
}
180139
}

test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,5 +520,41 @@ public void ParseSchemaWithUnrecognizedKeywordsWorks()
520520
Assert.Equal(2, schema.UnrecognizedKeywords.Count);
521521
}
522522

523+
[Fact]
524+
public void ParseSchemaExampleWithPrimitivesWorks()
525+
{
526+
var expected1 = @"{
527+
""type"": ""string"",
528+
""example"": ""2024-01-02""
529+
}";
530+
531+
var expected2 = @"{
532+
""type"": ""string"",
533+
""example"": ""3.14""
534+
}";
535+
var schema = new OpenApiSchema()
536+
{
537+
Type = JsonSchemaType.String,
538+
Example = JsonValue.Create("2024-01-02")
539+
};
540+
541+
var schema2 = new OpenApiSchema()
542+
{
543+
Type = JsonSchemaType.String,
544+
Example = JsonValue.Create("3.14")
545+
};
546+
547+
var textWriter = new StringWriter();
548+
var writer = new OpenApiJsonWriter(textWriter);
549+
schema.SerializeAsV31(writer);
550+
var actual1 = textWriter.ToString();
551+
Assert.Equal(expected1.MakeLineBreaksEnvironmentNeutral(), actual1.MakeLineBreaksEnvironmentNeutral());
552+
553+
textWriter = new StringWriter();
554+
writer = new OpenApiJsonWriter(textWriter);
555+
schema2.SerializeAsV31(writer);
556+
var actual2 = textWriter.ToString();
557+
Assert.Equal(expected2.MakeLineBreaksEnvironmentNeutral(), actual2.MakeLineBreaksEnvironmentNeutral());
558+
}
523559
}
524560
}

test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,8 @@ from shouldBeTerse in shouldProduceTerseOutputValues
164164
[MemberData(nameof(StringifiedDateTimes))]
165165
public async Task WriteOpenApiDateTimeAsJsonWorksAsync(string inputString, bool produceTerseOutput)
166166
{
167-
// Arrange
168-
var input = DateTimeOffset.Parse(inputString, CultureInfo.InvariantCulture);
169-
var dateTimeValue = input;
170-
171-
var json = await WriteAsJsonAsync(dateTimeValue, produceTerseOutput);
172-
var expectedJson = "\"" + input.ToString("o") + "\"";
167+
var json = await WriteAsJsonAsync(inputString, produceTerseOutput);
168+
var expectedJson = "\"" + inputString + "\"";
173169

174170
// Assert
175171
Assert.Equal(expectedJson, json);

0 commit comments

Comments
 (0)