diff --git a/SrcMod/Shell/Valve/VdfConvert.cs b/SrcMod/Shell/Valve/VdfConvert.cs index ff69a19..156ae9f 100644 --- a/SrcMod/Shell/Valve/VdfConvert.cs +++ b/SrcMod/Shell/Valve/VdfConvert.cs @@ -34,6 +34,7 @@ public static class VdfConvert VdfTreeNode tree = new(); if (obj is IVdfSerializable vdf) return vdf.ToNodeTree(); + else if (obj is string str) return new VdfSingleNode(str); else if (obj is IDictionary dictionary) { object[] keys = new object[dictionary.Count], @@ -42,7 +43,7 @@ public static class VdfConvert dictionary.Values.CopyTo(values, 0); for (int i = 0; i < dictionary.Count; i++) { - tree[SerializeObject(keys.GetValue(i), options)!] = ToNodeTree(values.GetValue(i)); + tree[SerializeObject(keys.GetValue(i), options)!] = ToNodeTree(values.GetValue(i), options); } return tree; } @@ -51,7 +52,7 @@ public static class VdfConvert int index = 0; foreach (object item in enumerable) { - tree[SerializeObject(index, options)!] = ToNodeTree(item); + tree[SerializeObject(index, options)!] = ToNodeTree(item, options); index++; } return tree; @@ -67,17 +68,28 @@ public static class VdfConvert where isPublic && !isStatic && !isIgnored && !isConst select field; - IEnumerable validProperties = from prop in type.GetProperties() - let canGet = prop.GetMethod is not null - let isPublic = canGet && prop.GetMethod!.IsPublic - let isStatic = canGet && prop.GetMethod!.IsStatic - let isIgnored = prop.CustomAttributes.Any(x => - x.AttributeType == typeof(VdfIgnoreAttribute)) - where canGet && isPublic && !isStatic && !isIgnored - select prop; + IEnumerable validProperties; + if (options.serializeProperties) + { + validProperties = from prop in type.GetProperties() + let canGet = prop.GetMethod is not null + let isPublic = canGet && prop.GetMethod!.IsPublic + let isStatic = canGet && prop.GetMethod!.IsStatic + let isIgnored = prop.CustomAttributes.Any(x => + x.AttributeType == typeof(VdfIgnoreAttribute)) + where canGet && isPublic && !isStatic && !isIgnored + select prop; + } + else validProperties = Array.Empty(); - foreach (FieldInfo field in validFields) Write($"field: {field.Name}"); - foreach (PropertyInfo prop in validProperties) Write($"prop: {prop.Name}"); + foreach (FieldInfo field in validFields) + { + tree[field.Name] = ToNodeTree(field.GetValue(obj), options); + } + foreach (PropertyInfo prop in validProperties) + { + tree[prop.Name] = ToNodeTree(prop.GetValue(obj), options); + } return tree; } diff --git a/SrcMod/Shell/Valve/VdfOptions.cs b/SrcMod/Shell/Valve/VdfOptions.cs index 2287658..6e5e03d 100644 --- a/SrcMod/Shell/Valve/VdfOptions.cs +++ b/SrcMod/Shell/Valve/VdfOptions.cs @@ -7,6 +7,7 @@ public record class VdfOptions public bool closeWhenFinished; public int indentSize; public bool resetStreamPosition; + public bool serializeProperties; public bool useEscapeCodes; public bool useQuotes; @@ -15,6 +16,7 @@ public record class VdfOptions closeWhenFinished = true; indentSize = 4; resetStreamPosition = false; + serializeProperties = true; useEscapeCodes = false; useQuotes = false; } diff --git a/SrcMod/Shell/Valve/VdfTreeNode.cs b/SrcMod/Shell/Valve/VdfTreeNode.cs index 2cef7cf..610b231 100644 --- a/SrcMod/Shell/Valve/VdfTreeNode.cs +++ b/SrcMod/Shell/Valve/VdfTreeNode.cs @@ -38,6 +38,8 @@ public class VdfTreeNode : VdfNode, IEnumerable> } } + public void Add(string key, VdfNode? value) => this[key] = value; + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public IEnumerator> GetEnumerator() => p_subNodes.GetEnumerator(); }