more audit work
This commit is contained in:
@@ -13,7 +13,11 @@ public sealed class DeterminismManifestReader
|
||||
{
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
|
||||
Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }
|
||||
Converters =
|
||||
{
|
||||
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase),
|
||||
new ObjectValueConverter()
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@@ -225,6 +229,127 @@ public sealed class DeterminismManifestReader
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class ObjectValueConverter : JsonConverter<object?>
|
||||
{
|
||||
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
=> ReadValue(ref reader, options);
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, object? value, JsonSerializerOptions options)
|
||||
{
|
||||
if (value is null)
|
||||
{
|
||||
writer.WriteNullValue();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (value)
|
||||
{
|
||||
case string text:
|
||||
writer.WriteStringValue(text);
|
||||
return;
|
||||
case bool flag:
|
||||
writer.WriteBooleanValue(flag);
|
||||
return;
|
||||
case int intValue:
|
||||
writer.WriteNumberValue(intValue);
|
||||
return;
|
||||
case long longValue:
|
||||
writer.WriteNumberValue(longValue);
|
||||
return;
|
||||
case float floatValue:
|
||||
writer.WriteNumberValue(floatValue);
|
||||
return;
|
||||
case double doubleValue:
|
||||
writer.WriteNumberValue(doubleValue);
|
||||
return;
|
||||
case decimal decimalValue:
|
||||
writer.WriteNumberValue(decimalValue);
|
||||
return;
|
||||
case byte[] bytes:
|
||||
writer.WriteBase64StringValue(bytes);
|
||||
return;
|
||||
case IDictionary<string, object?> dictionary:
|
||||
writer.WriteStartObject();
|
||||
foreach (var (key, itemValue) in dictionary)
|
||||
{
|
||||
writer.WritePropertyName(key);
|
||||
Write(writer, itemValue, options);
|
||||
}
|
||||
writer.WriteEndObject();
|
||||
return;
|
||||
case IEnumerable<object?> list:
|
||||
writer.WriteStartArray();
|
||||
foreach (var item in list)
|
||||
{
|
||||
Write(writer, item, options);
|
||||
}
|
||||
writer.WriteEndArray();
|
||||
return;
|
||||
default:
|
||||
JsonSerializer.Serialize(writer, value, value.GetType(), options);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private static IDictionary<string, object?> ReadObject(ref Utf8JsonReader reader, JsonSerializerOptions options)
|
||||
{
|
||||
var values = new Dictionary<string, object?>(StringComparer.Ordinal);
|
||||
while (reader.Read())
|
||||
{
|
||||
if (reader.TokenType == JsonTokenType.EndObject)
|
||||
{
|
||||
return values;
|
||||
}
|
||||
|
||||
if (reader.TokenType != JsonTokenType.PropertyName)
|
||||
{
|
||||
throw new JsonException("Expected property name.");
|
||||
}
|
||||
|
||||
var propertyName = reader.GetString() ?? string.Empty;
|
||||
if (!reader.Read())
|
||||
{
|
||||
throw new JsonException("Unexpected end of JSON.");
|
||||
}
|
||||
|
||||
values[propertyName] = ReadValue(ref reader, options);
|
||||
}
|
||||
|
||||
throw new JsonException("Unexpected end of JSON.");
|
||||
}
|
||||
|
||||
private static IList<object?> ReadArray(ref Utf8JsonReader reader, JsonSerializerOptions options)
|
||||
{
|
||||
var values = new List<object?>();
|
||||
while (reader.Read())
|
||||
{
|
||||
if (reader.TokenType == JsonTokenType.EndArray)
|
||||
{
|
||||
return values;
|
||||
}
|
||||
|
||||
values.Add(ReadValue(ref reader, options));
|
||||
}
|
||||
|
||||
throw new JsonException("Unexpected end of JSON.");
|
||||
}
|
||||
|
||||
private static object? ReadValue(ref Utf8JsonReader reader, JsonSerializerOptions options)
|
||||
{
|
||||
return reader.TokenType switch
|
||||
{
|
||||
JsonTokenType.String => reader.GetString(),
|
||||
JsonTokenType.Number => reader.TryGetInt64(out var number) ? number : reader.GetDouble(),
|
||||
JsonTokenType.True => true,
|
||||
JsonTokenType.False => false,
|
||||
JsonTokenType.Null => null,
|
||||
JsonTokenType.StartObject => ReadObject(ref reader, options),
|
||||
JsonTokenType.StartArray => ReadArray(ref reader, options),
|
||||
_ => throw new JsonException("Unsupported JSON token.")
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsSupportedHashAlgorithm(string algorithm)
|
||||
{
|
||||
return algorithm switch
|
||||
|
||||
Reference in New Issue
Block a user