You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/Config/Implementation/YamlFileReader.cs

114 lines
4.0 KiB

using System;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization;
using System.IO;
using ZeroLevel.Services.Formats.YAML;
namespace ZeroLevel.Services.Config.Implementation
{
internal sealed class YamlFileReader
: IConfigurationReader
{
private readonly string _yamlPath;
internal YamlFileReader(string configPath)
{
if (String.IsNullOrWhiteSpace(configPath))
{
Log.Fatal($"[{nameof(JsonFileReader)}] File path is null or empty");
throw new ArgumentNullException("configPath", "File path is null or empty");
}
if (!File.Exists(configPath))
{
configPath = Path.Combine(Configuration.BaseDirectory, configPath);
if (!File.Exists(configPath))
{
Log.Fatal($"[{nameof(JsonFileReader)}] File path '{configPath}' not exists");
throw new FileNotFoundException($"File path '{configPath}' not exists");
}
}
_yamlPath = configPath;
}
public IConfiguration ReadConfiguration()
{
var set = ReadConfigurationSet();
return set.Default;
}
private static Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
public IConfigurationSet ReadConfigurationSet()
{
try
{
var yaml = File.ReadAllText(_yamlPath);
var json = FullYamlToJsonConverter.Convert(yaml);
using (Stream stream = GenerateStreamFromString(json))
{
IConfigurationSet set = Configuration.CreateSet();
var dict = JsonConfigurationFileParser.Parse(stream);
foreach (var kv in dict)
{
if (string.CompareOrdinal(Configuration.DEFAULT_SECTION_NAME, kv.Key) == 0)
{
foreach (var set_kv in kv.Value)
{
set.Default.Append(set_kv.Key, set_kv.Value);
}
}
else
{
var sectionName = kv.Key;
IConfiguration section;
if (false == set.ContainsSection(sectionName))
{
section = set.CreateSection(sectionName);
}
else
{
section = set.GetSection(sectionName);
}
foreach (var set_kv in kv.Value)
{
section.Append(set_kv.Key, set_kv.Value);
}
}
}
return set;
}
}
catch (Exception ex)
{
Log.Error(ex, $"[YamlFileReader] Failed to load configuration from file '{_yamlPath}'.");
throw new InvalidDataException($"Failed to load configuration from file '{_yamlPath}'.");
}
}
private static class FullYamlToJsonConverter
{
public static string Convert(string yaml)
{
var deserializer = new DeserializerBuilder().Build();
var yamlObject = deserializer.Deserialize(yaml);
var serializer = new SerializerBuilder()
.JsonCompatible()
.Build();
var json = serializer.Serialize(yamlObject);
return json;
}
}
}
}

Powered by TurnKey Linux.