in src/Elastic.Transport/Responses/Dynamic/DynamicDictionary.cs [44:98]
public Dictionary<string, object> ToDictionary() =>
_backingDictionary.ToDictionary(kv => kv.Key, kv => kv.Value.Value is JsonElement e ? DynamicValue.ConsumeJsonElement(typeof(object), e) : kv.Value.Value);
/// <summary>
/// Returns an empty dynamic dictionary.
/// </summary>
/// <value>A <see cref="DynamicDictionary" /> instance.</value>
public static DynamicDictionary Empty => new DynamicDictionary();
/// <summary>
/// Gets a value indicating whether the <see cref="DynamicDictionary" /> is read-only.
/// </summary>
/// <returns>Always returns <see langword="false" />.</returns>
public bool IsReadOnly => false;
private static readonly Regex SplitRegex = new(@"(?<!\\)\.");
/// <summary>
/// Traverses data using path notation.
/// <para><c>e.g some.deep.nested.json.path</c></para>
/// <para></para>
/// <para> A special lookup is available for ANY key <c>_arbitrary_key_</c> <c>e.g some.deep._arbitrary_key_.json.path</c> which will traverse into the first key</para>
/// <para> If <c>_arbitrary_key_</c> is the last value it will return the key name</para>
/// <para></para>
/// </summary>
/// <param name="path">path into the stored object, keys are separated with a dot and the last key is returned as T</param>
/// <typeparam name="T"></typeparam>
/// <returns>T or default</returns>
public T Get<T>(string path)
{
if (path == null) return default;
var split = SplitRegex.Split(path);
var queue = new Queue<string>(split);
if (queue.Count == 0) return default;
var d = new DynamicValue(_backingDictionary);
while (queue.Count > 0)
{
var key = queue.Dequeue().Replace(@"\.", ".");
if (key == "_arbitrary_key_")
{
if (queue.Count > 0) d = d[0];
else
{
var v = d?.ToDictionary()?.Keys.FirstOrDefault();
d = v != null ? new DynamicValue(v) : DynamicValue.NullValue;
}
}
else if (int.TryParse(key, out var i)) d = d[i];
else d = d[key];
}
return d.TryParse<T>();
}