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
4 changes: 2 additions & 2 deletions dotnet-client-libraries/YamlDotNet/App/App.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="YamlDotNet" Version="15.1.2"/>
<PackageReference Include="YamlDotNet" Version="18.1.0"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace App.Models;

public class ServiceConfig
{
public required string ServiceName { get; set; }
public int MaxRetries { get; set; }
}
10 changes: 10 additions & 0 deletions dotnet-client-libraries/YamlDotNet/App/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using App.UseCases;
using YamlDotNet.Core;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;

namespace App;
Expand Down Expand Up @@ -80,6 +81,15 @@ var deserializer
Console.WriteLine($"Unable to deserialize person: {e.Message}");
}

// Map YAML Names to C# Property Names

var config = new ServiceConfig { ServiceName = "orders", MaxRetries = 3 };
var hyphenatedYaml = NamingConventions.Serialize(config, HyphenatedNamingConvention.Instance);
Console.WriteLine(hyphenatedYaml);

var deserializeConfig = NamingConventions.Deserialize<ServiceConfig>(hyphenatedYaml, HyphenatedNamingConvention.Instance);
Console.WriteLine($"ServiceName: {deserializeConfig.ServiceName}, MaxRetries: {deserializeConfig.MaxRetries}");

// JSON Support in YamlDotNet

var yamlPerson = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
public class DeserializerValidation(INodeDeserializer nodeDeserializer) : INodeDeserializer
{
public bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer,
out object? value)
out object? value, ObjectDeserializer rootDeserializer)
{
if (!nodeDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value))
if (!nodeDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value, rootDeserializer))
return false;

var context = new ValidationContext(value);

Check warning on line 16 in dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs

View workflow job for this annotation

GitHub Actions / Build & test (dotnet-client-libraries/YamlDotNet)

Possible null reference argument for parameter 'instance' in 'ValidationContext.ValidationContext(object instance)'.

Check warning on line 16 in dotnet-client-libraries/YamlDotNet/App/UseCases/DeserializerValidation.cs

View workflow job for this annotation

GitHub Actions / Build & test (dotnet-client-libraries/YamlDotNet)

Possible null reference argument for parameter 'instance' in 'ValidationContext.ValidationContext(object instance)'.
var results = new List<ValidationResult>();
if (Validator.TryValidateObject(value, context, results, true))
return true;
Expand All @@ -21,4 +21,4 @@
var message = string.Join(NewLine, results.Select(r => r.ErrorMessage));
throw new YamlException(message);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using YamlDotNet.Serialization;

namespace App.UseCases;

public static class NamingConventions
{
public static string Serialize<T>(T obj, INamingConvention namingConvention)
{
var serializer = new SerializerBuilder()
.WithNamingConvention(namingConvention)
.Build();

return serializer.Serialize(obj);
}

public static T Deserialize<T>(string yaml, INamingConvention namingConvention)
{
var deserializer = new DeserializerBuilder()
.WithNamingConvention(namingConvention)
.Build();

return deserializer.Deserialize<T>(yaml);
}
}
29 changes: 29 additions & 0 deletions dotnet-client-libraries/YamlDotNet/Tests/NamingConventionsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using App.Models;
using App.UseCases;
using static System.Environment;
using YamlDotNet.Serialization.NamingConventions;

namespace Tests;

public class NamingConventionsTests
{
[Fact]
public void GivenConfig_WhenSerializedWithHyphenatedConvention_ThenKeysAreHyphenated()
{
var config = new ServiceConfig { ServiceName = "orders", MaxRetries = 3 };
var expectedYaml = $"service-name: orders{NewLine}max-retries: 3{NewLine}";
var actualYaml = NamingConventions.Serialize(config, HyphenatedNamingConvention.Instance);

Assert.Equal(expectedYaml, actualYaml);
}

[Fact]
public void GivenHyphenatedYaml_WhenDeserializedWithHyphenatedConvention_ThenConfigIsReturned()
{
var yaml = $"service-name: orders{NewLine}max-retries: 3";
var actualConfig = NamingConventions.Deserialize<ServiceConfig>(yaml, HyphenatedNamingConvention.Instance);

Assert.Equal("orders", actualConfig.ServiceName);
Assert.Equal(3, actualConfig.MaxRetries);
}
}
10 changes: 5 additions & 5 deletions dotnet-client-libraries/YamlDotNet/Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
<PackageReference Include="xunit" Version="2.5.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3"/>
<PackageReference Include="coverlet.collector" Version="10.0.1"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0"/>
<PackageReference Include="xunit" Version="2.9.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2"/>
</ItemGroup>

<ItemGroup>
Expand Down
Loading