Skip to content

Commit 5b1a831

Browse files
Add a utility for YAML loading. (#98)
1 parent c2df930 commit 5b1a831

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

src/Yaml.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using YamlDotNet.Serialization;
4+
using YamlDotNet.Serialization.NamingConventions;
5+
6+
namespace k8s
7+
{
8+
/// <summary>
9+
/// This is a utility class that helps you load objects from YAML files.
10+
/// </summary>
11+
12+
public class Yaml {
13+
public static async Task<T> LoadFromStreamAsync<T>(Stream stream) {
14+
var reader = new StreamReader(stream);
15+
var content = await reader.ReadToEndAsync();
16+
return LoadFromString<T>(content);
17+
}
18+
19+
public static async Task<T> LoadFromFileAsync<T> (string file) {
20+
using (FileStream fs = File.Open(file, FileMode.Open, FileAccess.Write, FileShare.None)) {
21+
return await LoadFromStreamAsync<T>(fs);
22+
}
23+
}
24+
25+
public static T LoadFromString<T>(string content) {
26+
var deserializer =
27+
new DeserializerBuilder()
28+
.WithNamingConvention(new CamelCaseNamingConvention())
29+
.Build();
30+
var obj = deserializer.Deserialize<T>(content);
31+
return obj;
32+
}
33+
}
34+
}

tests/YamlTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System.IO;
2+
using k8s.Models;
3+
using Xunit;
4+
5+
namespace k8s.Tests
6+
{
7+
public class YamlTests {
8+
[Fact]
9+
public void LoadFromString()
10+
{
11+
var content = @"apiVersion: v1
12+
kind: Pod
13+
metadata:
14+
name: foo
15+
";
16+
17+
var obj = Yaml.LoadFromString<V1Pod>(content);
18+
19+
Assert.Equal("foo", obj.Metadata.Name);
20+
}
21+
22+
[Fact]
23+
public void LoadFromStream()
24+
{
25+
var content = @"apiVersion: v1
26+
kind: Pod
27+
metadata:
28+
name: foo
29+
";
30+
31+
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(content)))
32+
{
33+
var obj = Yaml.LoadFromStreamAsync<V1Pod>(stream).Result;
34+
35+
Assert.Equal("foo", obj.Metadata.Name);
36+
}
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)