Advertisement
RaWRCoder

Config

Nov 5th, 2015
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.56 KB | None | 0 0
  1. /* Format example
  2. Master {
  3.     ClientConnection {
  4.         ListenIP = 0.0.0.0
  5.         ListenPort = 25000
  6.         Backlog = 32
  7.         MaxInactiveTime1 = 600.0
  8.         MaxInactiveTime2 = 900.0
  9.         }
  10.  
  11.     LoginServerConnection {
  12.         IP = 127.0.0.1
  13.         Port = 26000
  14.         }
  15.  
  16.     DB {
  17.         Data Source = example.net
  18.         Port = 3306
  19.         Database = example_db
  20.         User Id = userid
  21.         Password = pwd
  22.         }
  23. }
  24. */
  25.  
  26. public class ConfigObject
  27.     {
  28.         protected ConfigObject()
  29.         {
  30.             Name = "<root>";
  31.             Parent = null;
  32.         }
  33.         public ConfigObject(string name, ConfigObject parent)
  34.         {
  35.             Name = name;
  36.             Parent = parent;
  37.         }
  38.         private Dictionary<string, ConfigObject> Objects { get; } = new Dictionary<string, ConfigObject>();
  39.         private Dictionary<string, string> Data { get; } = new Dictionary<string, string>();
  40.         public string Name { get; }
  41.         public ConfigObject Parent { get; }
  42.  
  43.         public IEnumerable<ConfigObject> AllObjects => Objects.Values;
  44.         public IEnumerable<string> AllObjectNames => Objects.Keys;
  45.         public bool ContainsObject(string name) => Objects.ContainsKey(name);
  46.         public ConfigObject GetObject(string name)
  47.         {
  48.             ConfigObject o;
  49.             return Objects.TryGetValue(name, out o) ? o : null;
  50.         }
  51.         public ConfigObject AddNewObject(string name)
  52.         {
  53.             var o = new ConfigObject(name, this);
  54.             Objects[name] = o;
  55.             return o;
  56.         }
  57.         public ConfigObject GetOrCreateObject(string name)
  58.         {
  59.             return GetObject(name) ?? AddNewObject(name);
  60.         }
  61.         public bool RemoveObject(string name)
  62.         {
  63.             return Objects.Remove(name);
  64.         }
  65.         public void RemoveAllObjects() => Objects.Clear();
  66.  
  67.  
  68.         public IEnumerable<string> AllFields => Data.Values;
  69.         public IEnumerable<string> AllFieldNames => Data.Keys;
  70.         public bool ContainsField(string name) => Data.ContainsKey(name);
  71.         public string GetStringField(string name, string defaultValue = null)
  72.         {
  73.             string v;
  74.             return Data.TryGetValue(name, out v) ? v : defaultValue;
  75.         }
  76.         public long GetIntField(string name, long defaultValue = 0)
  77.         {
  78.             var svalue = GetStringField(name);
  79.             if (string.IsNullOrWhiteSpace(svalue))
  80.                 return defaultValue;
  81.             long value;
  82.             if (long.TryParse(svalue, out value))
  83.                 return value;
  84.             if (long.TryParse(svalue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out value))
  85.                 return value;
  86.             return defaultValue;
  87.         }
  88.         public double GetFloatField(string name, double defaultValue = 0)
  89.         {
  90.             var svalue = GetStringField(name);
  91.             if (string.IsNullOrWhiteSpace(svalue))
  92.                 return defaultValue;
  93.             double value;
  94.             return double.TryParse(svalue, out value) ? value : defaultValue;
  95.         }
  96.         public bool GetBoolField(string name, bool defaultValue = false)
  97.         {
  98.             var sv = GetStringField(name).ToLowerInvariant().Trim();
  99.             switch (sv)
  100.             {
  101.                 case "true":
  102.                 case "yes":
  103.                 case "y":
  104.                 case "t":
  105.                     return true;
  106.                 case "false":
  107.                 case "no":
  108.                 case "n":
  109.                 case "f":
  110.                     return false;
  111.             }
  112.             var iv = GetIntField(name, defaultValue ? 1 : 0);
  113.             return iv != 0;
  114.         }
  115.  
  116.         public void SetField(string name, object value)
  117.         {
  118.             Data[name] = value.ToString();
  119.         }
  120.         protected internal void SaveTo(StreamWriter w)
  121.         {
  122.             w.WriteLine(Name + " {");
  123.  
  124.             foreach (var name in AllObjectNames)
  125.             {
  126.                 GetObject(name).SaveTo(w);
  127.             }
  128.             w.WriteLine();
  129.             foreach (var name in AllFieldNames)
  130.             {
  131.                 w.WriteLine($"{name} = {GetStringField(name)}");
  132.             }
  133.  
  134.             w.WriteLine("}");
  135.         }
  136.  
  137.         public override string ToString()
  138.         {
  139.             var o = this;
  140.             var s = Name;
  141.             o = o.Parent;
  142.             while (o?.Parent != null)
  143.             {
  144.                 s = $"{o.Name}." + s;
  145.                 o = o.Parent;
  146.             }
  147.             return s;
  148.         }
  149.  
  150.         public ConfigObject ResolveObject(string name)
  151.         {
  152.             var id = name.IndexOf(".", StringComparison.Ordinal);
  153.             if (id < 0)
  154.                 return GetObject(name.Trim());
  155.            
  156.             var obj = GetObject(name.Substring(0, id).Trim());
  157.             return obj?.ResolveObject(name.Substring(id + 1).Trim());
  158.         }
  159.         public ConfigObject ResolveOrCreateObject(string name)
  160.         {
  161.             var id = name.IndexOf(".", StringComparison.Ordinal);
  162.             if (id < 0)
  163.                 return GetOrCreateObject(name.Trim());
  164.  
  165.             var obj = GetOrCreateObject(name.Substring(0, id).Trim());
  166.             return obj.ResolveOrCreateObject(name.Substring(id + 1).Trim());
  167.         }
  168.         public object Resolve(string name)
  169.         {
  170.             var id = name.IndexOf(".", StringComparison.Ordinal);
  171.             if (id < 0)
  172.                 return (object) GetObject(name.Trim()) ?? GetStringField(name.Trim());
  173.  
  174.             var obj = GetObject(name.Substring(0, id).Trim());
  175.             return obj?.Resolve(name.Substring(id + 1).Trim());
  176.         }
  177.     }
  178.  
  179. public class Config : ConfigObject
  180.     {
  181.         public Config(StreamReader r)
  182.         {
  183.             var stack = new Stack<ConfigObject>();
  184.             ConfigObject currentObj = this;
  185.             while (!r.EndOfStream)
  186.             {
  187.                 var str = r.ReadLine();
  188.                 if (string.IsNullOrWhiteSpace(str) || str.Trim().StartsWith("//"))
  189.                     continue;
  190.                 str = str.Trim();
  191.                 if (str.EndsWith("{"))
  192.                 {
  193.                     stack.Push(currentObj);
  194.                     var path = str.Substring(0, str.Length-1).Trim();
  195.                     currentObj = currentObj.ResolveOrCreateObject(path);
  196.                     continue;
  197.                 }
  198.                 if (str.StartsWith("}"))
  199.                 {
  200.                     currentObj = stack.Any() ? stack.Pop() : this;
  201.                     continue;
  202.                 }
  203.  
  204.                 var id = str.IndexOf("=", StringComparison.Ordinal);
  205.                 if (id < 0)
  206.                     continue;
  207.                 var key = str.Substring(0, id).Trim();
  208.                 var value = str.Substring(id + 1).Trim();
  209.                 var keyPath = key.Split('.');
  210.                 var obj = currentObj;
  211.                 for (int i = 0; i < keyPath.Length-1; i++)
  212.                 {
  213.                     var name = keyPath[i].Trim();
  214.                     if (string.IsNullOrWhiteSpace(str))
  215.                         continue;
  216.                     obj = obj.GetOrCreateObject(name);
  217.                 }
  218.                 obj.SetField(keyPath.Last(), value);
  219.             }
  220.         }
  221.         public void Save(StreamWriter w)
  222.         {
  223.             w.WriteLine("// Root fields");
  224.             foreach (var name in AllFieldNames)
  225.             {
  226.                 w.WriteLine($"{name} = {GetStringField(name)}");
  227.             }
  228.             foreach (var name in AllObjectNames)
  229.             {
  230.                 w.WriteLine();
  231.                 GetObject(name).SaveTo(w);
  232.             }
  233.         }
  234.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement