-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStateDump.cs
84 lines (76 loc) · 1.99 KB
/
StateDump.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Generated;
//TODO Key field
public class StateDump
{
[JsonIgnore]
public StateDump Parent { get; private set; }
public string Tag { get; set; }
public Dictionary<string, object> State { get; set; } = [];
public List<StateDump> Children { get; set; } = [];
public StateDump GetOrAddChild(string tag, int indexByTag)
{
var result = Children
.Where((it) => it.Tag == tag)
.Skip(indexByTag)
.FirstOrDefault();
if (result is null)
{
result = new()
{
Tag = tag
};
Children.Add(result);
}
result.Parent = this;
return result;
}
public StateDump FindParent(string tag)
{
for (var temp = Parent;
temp is not null;
temp = temp.Parent)
{
if (temp.Tag == tag)
{
return temp;
}
}
return null;
}
public T Get<T>(string name)
{
return (T)(State.TryGetValue(name, out var _v)
? (State[name] = _v is null ? default : _v.ParseIfNot<T>())
: default);
}
public T? GetNullable<T>(string name) where T : struct
{
return (State.TryGetValue(name, out var _v)
? (State[name] = (_v?.ParseIfNot<T>()))
: null)
as T?;
}
public void Trim(Dictionary<string, int> tagCounts)
{
Children = tagCounts
.SelectMany((kv) => Children.Where((it) => it.Tag == kv.Key).Take(kv.Value + 1))
.ToList();
}
}
public static class StateDumpExtensions
{
public static T ParseIfNot<T>(this object o)
{
if (o is null)
{
return default;
}
if (o is JsonElement json && typeof(T) != typeof(JsonElement))
{
return JsonSerializer.Deserialize<T>(json);
}
return (T)o;
}
}