Skip to content

Commit

Permalink
fix: remove type casting for strings
Browse files Browse the repository at this point in the history
  • Loading branch information
MaggieKimani1 committed Feb 20, 2025
1 parent 5db8757 commit 8cc7d4e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 52 deletions.
51 changes: 5 additions & 46 deletions src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
writer.WriteObject(node as JsonObject);
break;
case JsonValueKind.String: // Primitive
writer.WritePrimitive(node);
writer.WriteValue(node.GetValue<string>());
break;
case JsonValueKind.Number: // Primitive
writer.WritePrimitive(node);
writer.WriteNumber(node);
break;
case JsonValueKind.True or JsonValueKind.False: // Primitive
writer.WritePrimitive(node);
writer.WriteValue(node.GetValue<bool>());
break;
case JsonValueKind.Null: // null
writer.WriteNull();
Expand Down Expand Up @@ -109,43 +109,10 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
writer.WriteEndObject();
}

private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitive)
private static void WriteNumber(this IOpenApiWriter writer, JsonNode number)
{
Utils.CheckArgumentNull(writer);

var valueKind = primitive.GetValueKind();

if (valueKind == JsonValueKind.String && primitive is JsonValue jsonStrValue)
if (number is JsonValue jsonValue)
{
if (jsonStrValue.TryGetValue<DateTimeOffset>(out var dto))
{
writer.WriteValue(dto);
}
else if (jsonStrValue.TryGetValue<DateTime>(out var dt))
{
writer.WriteValue(dt);
}
else if (jsonStrValue.TryGetValue<string>(out var strValue))
{
// check whether string is actual string or date time object
if (DateTimeOffset.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset))
{
writer.WriteValue(dateTimeOffset);
}
else if (DateTime.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
{ // order matters, DTO needs to be checked first!!!
writer.WriteValue(dateTime);
}
else
{
writer.WriteValue(strValue);
}
}
}

else if (valueKind == JsonValueKind.Number && primitive is JsonValue jsonValue)
{

if (jsonValue.TryGetValue<decimal>(out var decimalValue))
{
writer.WriteValue(decimalValue);
Expand All @@ -167,14 +134,6 @@ private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitiv
writer.WriteValue(intValue);
}
}
else if (valueKind is JsonValueKind.False)
{
writer.WriteValue(false);
}
else if (valueKind is JsonValueKind.True)
{
writer.WriteValue(true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -520,5 +520,41 @@ public void ParseSchemaWithUnrecognizedKeywordsWorks()
Assert.Equal(2, schema.UnrecognizedKeywords.Count);
}

[Fact]
public void ParseSchemaExampleWithPrimitivesWorks()
{
var expected1 = @"{
""type"": ""string"",
""example"": ""2024-01-02""
}";

var expected2 = @"{
""type"": ""string"",
""example"": ""3.14""
}";
var schema = new OpenApiSchema()
{
Type = JsonSchemaType.String,
Example = JsonValue.Create("2024-01-02")
};

var schema2 = new OpenApiSchema()
{
Type = JsonSchemaType.String,
Example = JsonValue.Create("3.14")
};

var textWriter = new StringWriter();
var writer = new OpenApiJsonWriter(textWriter);
schema.SerializeAsV31(writer);
var actual1 = textWriter.ToString();
Assert.Equal(expected1.MakeLineBreaksEnvironmentNeutral(), actual1.MakeLineBreaksEnvironmentNeutral());

textWriter = new StringWriter();
writer = new OpenApiJsonWriter(textWriter);
schema2.SerializeAsV31(writer);
var actual2 = textWriter.ToString();
Assert.Equal(expected2.MakeLineBreaksEnvironmentNeutral(), actual2.MakeLineBreaksEnvironmentNeutral());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,8 @@ from shouldBeTerse in shouldProduceTerseOutputValues
[MemberData(nameof(StringifiedDateTimes))]
public async Task WriteOpenApiDateTimeAsJsonWorksAsync(string inputString, bool produceTerseOutput)
{
// Arrange
var input = DateTimeOffset.Parse(inputString, CultureInfo.InvariantCulture);
var dateTimeValue = input;

var json = await WriteAsJsonAsync(dateTimeValue, produceTerseOutput);
var expectedJson = "\"" + input.ToString("o") + "\"";
var json = await WriteAsJsonAsync(inputString, produceTerseOutput);
var expectedJson = "\"" + inputString + "\"";

// Assert
Assert.Equal(expectedJson, json);
Expand Down

0 comments on commit 8cc7d4e

Please sign in to comment.