using System.Collections;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using Newtonsoft.Json.Serialization;
using System.Xml.Serialization;
using Webber.Configuration;
namespace Webber.Configuration.Tests
public sealed class MainConfig : ConfigFile
public MainConfig(string path) : base(path, ConfigType.YAML)
public string Name { get; set; } = "Carl";
public int Age { get; set; } = 30;
public double Height { get; set; } = 5.5;
public bool IsMale { get; set; } = true;
public sealed class Program
public static void Main()
FileInfo conf = new FileInfo($"{Directory.GetCurrentDirectory()}/Config/webber.cfg");
cfg = new MainConfig(conf.FullName)
cfg = new MainConfig(conf.FullName);
cfg = ConfigFile.ReadConfig<MainConfig>(conf.FullName, ConfigType.YAML);
Console.WriteLine("{0} a {1} year old {2} is {3} feet.", cfg.Name, cfg.Age, (cfg.IsMale) ? "Male" : "Female", cfg.Height);
namespace Webber.Configuration
public abstract class ConfigFile
private ISerializationSerializer serializer;
private StreamWriter writer;
protected ConfigFile(string path, ConfigType t)
serializer = (t.Equals(ConfigType.YAML)) ? new YAMLSerializer() : ((t.Equals(ConfigType.JSON)) ? new JSONSerializer() : new XMLSerializer(typeof(ConfigFile)));
file = new FileInfo(Path.GetFullPath(path));
DirectoryInfo parentDir = file.Directory;
writer = new StreamWriter(file.FullName);
Console.WriteLine("Could not open or create file: \"{0}\" -> {1}!", file.FullName, iox.ToString());
public void Write(bool save = false)
using (StreamWriter w = writer)
if (GetConfigType().Equals(ConfigType.YAML))
((YAMLSerializer)s).GetSerializer().Serialize(w, this);
else if (GetConfigType().Equals(ConfigType.JSON))
((JSONSerializer)s).GetSerializer().Serialize(w, this);
((XMLSerializer)s).GetSerializer().Serialize(w, this);
using (StreamWriter w = writer)
public ISerializationSerializer GetSerializer() => serializer;
public ConfigType GetConfigType() => GetSerializer().GetConfigType();
internal void SetData(ISerializationSerializer serializer, FileInfo file)
this.serializer = serializer;
writer = new StreamWriter(file.FullName);
public static T ReadConfig<T>(string path, ConfigType ct) where T: ConfigFile
FileInfo fi = new FileInfo(Path.GetFullPath(path));
throw new FileNotFoundException($"The specified file \"{fi.FullName}\" does not exist!");
StreamReader reader = new StreamReader(fi.FullName);
ISerializationSerializer serializer = (ct.Equals(ConfigType.YAML)) ? new YAMLSerializer() : ((ct.Equals(ConfigType.JSON)) ? new JSONSerializer() : new XMLSerializer(typeof(T)));
using (StreamReader r = reader)
if (serializer.GetConfigType().Equals(ConfigType.YAML))
t = (T)((YAMLSerializer)serializer).GetDeserializer().Deserialize(r);
else if (serializer.GetConfigType().Equals(ConfigType.JSON))
t = (T)((JSONSerializer)serializer).GetDeserializer().Deserialize(new JsonTextReader(r));
t = (T)((XMLSerializer)serializer).GetDeserializer().Deserialize(r);
t.SetData(serializer, fi);
public interface ISerializationSerializer
object GetDeserializer();
ConfigType GetConfigType();
public sealed class XMLSerializer : ISerializationSerializer
private XmlSerializer serializer;
public XMLSerializer(Type t)
serializer = new XmlSerializer(t);
object ISerializationSerializer.GetSerializer() => GetSerializer();
object ISerializationSerializer.GetDeserializer() => GetDeserializer();
public XmlSerializer GetSerializer() => serializer;
public XmlSerializer GetDeserializer() => GetSerializer();
public ConfigType GetConfigType() => ConfigType.XML;
public sealed class JSONSerializer : ISerializationSerializer
private JsonSerializer serializer;
serializer = JsonSerializer.Create(new JsonSerializerSettings()
Formatting = Newtonsoft.Json.Formatting.Indented
object ISerializationSerializer.GetSerializer() => GetSerializer();
object ISerializationSerializer.GetDeserializer() => GetDeserializer();
public JsonSerializer GetSerializer() => serializer;
public JsonSerializer GetDeserializer() => GetSerializer();
public ConfigType GetConfigType() => ConfigType.JSON;
public sealed class YAMLSerializer : ISerializationSerializer
private ISerializer serializer;
private IDeserializer deserializer;
serializer = new SerializerBuilder().JsonCompatible().Build();
deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();
object ISerializationSerializer.GetSerializer() => GetSerializer();
object ISerializationSerializer.GetDeserializer() => GetDeserializer();
public ISerializer GetSerializer() => serializer;
public IDeserializer GetDeserializer() => deserializer;
public ConfigType GetConfigType() => ConfigType.YAML;