Small starts on the serializer.

This commit is contained in:
That_One_Nerd 2023-04-26 14:09:28 -04:00
parent 864c39be7f
commit 4d64b0bae6
3 changed files with 89 additions and 0 deletions

View File

@ -0,0 +1,30 @@
namespace SrcMod.Shell.Valve;
public static class KeyValueConvert
{
private static readonly Dictionary<string, string> p_escapeCodes = new()
{
{ "\'", "\\\'" },
{ "\"", "\\\"" },
{ "\\", "\\\\" },
{ "\0", "\\\0" },
{ "\a", "\\\a" },
{ "\b", "\\\b" },
{ "\f", "\\\f" },
{ "\n", "\\\n" },
{ "\r", "\\\r" },
{ "\t", "\\\t" },
{ "\v", "\\\v" }
};
public static string SerializeName(string content, KeyValueSerializer.Options? options = null)
{
options ??= KeyValueSerializer.Options.Default;
if (options.useNameQuotes) content = $"\"{content}\"";
if (options.useEscapeCodes)
foreach (KeyValuePair<string, string> escapeCode in p_escapeCodes)
content = content.Replace(escapeCode.Key, escapeCode.Value);
return content;
}
}

View File

@ -0,0 +1,18 @@
namespace SrcMod.Shell.Valve;
public class KeyValueNode
{
public int SubNodeCount => p_subNodes.Count;
public object value;
private Dictionary<string, KeyValueNode> p_subNodes;
internal KeyValueNode()
{
value = new();
p_subNodes = new();
}
public KeyValueNode this[string name] => p_subNodes[name];
}

View File

@ -0,0 +1,41 @@
namespace SrcMod.Shell.Valve;
public class KeyValueSerializer
{
public int? IndentSize => p_options.indentSize;
public bool UseEscapeCodes => p_options.useEscapeCodes;
public bool UseNameQuotes => p_options.useNameQuotes;
public bool UseValueQuotes => p_options.useValueQuotes;
private readonly Options p_options;
public KeyValueSerializer() : this(Options.Default) { }
public KeyValueSerializer(Options options)
{
p_options = options;
}
public StringBuilder Serialize(StringBuilder builder, KeyValueNode parentNode, string? parentNodeName = null)
{
if (parentNodeName is not null) builder.AppendLine(KeyValueConvert.SerializeName(parentNodeName, p_options));
return builder;
}
public record class Options
{
public static Options Default => new();
public int? indentSize;
public bool useEscapeCodes;
public bool useNameQuotes;
public bool useValueQuotes;
public Options()
{
indentSize = null;
useEscapeCodes = false;
useNameQuotes = true;
useValueQuotes = false;
}
}
}