refactor: implement validating deserializer for YamlDotNet

recyclarr
Robert Dailey 3 years ago
parent 420635d781
commit 03ee600346

@ -23,6 +23,7 @@ namespace Trash.Config
_configProvider = configProvider;
_fileSystem = fileSystem;
_deserializer = new DeserializerBuilder()
.WithRequiredPropertyValidation()
.WithNamingConvention(UnderscoredNamingConvention.Instance)
// .WithNamingConvention(CamelCaseNamingConvention.Instance)
.WithTypeConverter(new YamlNullableEnumTypeConverter())

@ -0,0 +1,45 @@
using System;
using System.ComponentModel.DataAnnotations;
using YamlDotNet.Core;
using YamlDotNet.Serialization;
namespace Trash.YamlDotNet
{
public class ValidatingDeserializer : INodeDeserializer
{
private readonly INodeDeserializer _nodeDeserializer;
public ValidatingDeserializer(INodeDeserializer nodeDeserializer)
{
_nodeDeserializer = nodeDeserializer;
}
public bool Deserialize(IParser parser, Type expectedType,
Func<IParser, Type, object?> nestedObjectDeserializer, out object? value)
{
if (!_nodeDeserializer.Deserialize(parser, expectedType, nestedObjectDeserializer, out value) ||
value == null)
{
return false;
}
var context = new ValidationContext(value, null, null);
try
{
Validator.ValidateObject(value, context, true);
}
catch (ValidationException e)
{
if (parser.Current == null)
{
throw;
}
throw new YamlException(parser.Current.Start, parser.Current.End, e.Message);
}
return true;
}
}
}

@ -1,5 +1,6 @@
using JetBrains.Annotations;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NodeDeserializers;
namespace Trash.YamlDotNet
{
@ -12,6 +13,13 @@ namespace Trash.YamlDotNet
return extractor.RootObject;
}
public static DeserializerBuilder WithRequiredPropertyValidation(this DeserializerBuilder builder)
{
return builder
.WithNodeDeserializer(inner => new ValidatingDeserializer(inner),
s => s.InsteadOf<ObjectNodeDeserializer>());
}
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
private class RootExtractor<T>
where T : class

Loading…
Cancel
Save