-
Notifications
You must be signed in to change notification settings - Fork 16
/
LocalSerializer.cs
85 lines (72 loc) · 3.65 KB
/
LocalSerializer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright 2016-2021, Pulumi Corporation
using System.Text.Json;
using System.Text.Json.Serialization;
using Pulumi.Automation.Events;
using Pulumi.Automation.Serialization.Json;
using Pulumi.Automation.Serialization.Yaml;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace Pulumi.Automation.Serialization
{
public class LocalSerializer
{
private readonly JsonSerializerOptions _jsonOptions;
private readonly IDeserializer _yamlDeserializer;
private readonly ISerializer _yamlSerializer;
public LocalSerializer()
{
// configure json
this._jsonOptions = BuildJsonSerializerOptions();
// configure yaml
this._yamlDeserializer = BuildYamlDeserializer();
this._yamlSerializer = BuildYamlSerializer();
}
public T DeserializeJson<T>(string content)
=> JsonSerializer.Deserialize<T>(content, this._jsonOptions);
public T DeserializeYaml<T>(string content)
where T : class
=> this._yamlDeserializer.Deserialize<T>(content);
public string SerializeJson<T>(T @object)
=> JsonSerializer.Serialize(@object, this._jsonOptions);
public string SerializeYaml<T>(T @object)
where T : class
=> this._yamlSerializer.Serialize(@object);
public static JsonSerializerOptions BuildJsonSerializerOptions()
{
var options = new JsonSerializerOptions
{
AllowTrailingCommas = true,
IgnoreNullValues = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
options.Converters.Add(new StringToEnumJsonConverter<OperationType, OperationTypeConverter>());
options.Converters.Add(new StringToEnumJsonConverter<DiffKind, DiffKindConverter>());
options.Converters.Add(new JsonStringEnumConverter(new LowercaseJsonNamingPolicy()));
options.Converters.Add(new SystemObjectJsonConverter());
options.Converters.Add(new MapToModelJsonConverter<ConfigValue, ConfigValueModel>());
options.Converters.Add(new MapToModelJsonConverter<PluginInfo, PluginInfoModel>());
options.Converters.Add(new MapToModelJsonConverter<ProjectSettings, ProjectSettingsModel>());
options.Converters.Add(new MapToModelJsonConverter<StackSummary, StackSummaryModel>());
options.Converters.Add(new MapToModelJsonConverter<UpdateSummary, UpdateSummaryModel>());
options.Converters.Add(new MapToModelJsonConverter<EngineEvent, EngineEventModel>());
options.Converters.Add(new ProjectRuntimeJsonConverter());
options.Converters.Add(new ResourceChangesJsonConverter());
options.Converters.Add(new StackSettingsConfigValueJsonConverter());
return options;
}
public static IDeserializer BuildYamlDeserializer()
=> new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.IgnoreUnmatchedProperties()
.WithTypeConverter(new ProjectRuntimeYamlConverter())
.WithTypeConverter(new StackSettingsConfigValueYamlConverter())
.Build();
public static ISerializer BuildYamlSerializer()
=> new SerializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull)
.WithTypeConverter(new ProjectRuntimeYamlConverter())
.WithTypeConverter(new StackSettingsConfigValueYamlConverter())
.Build();
}
}