using System.Collections.Generic; namespace SabreTools.Models.Internal { /// /// Specialized dictionary base for item types /// public abstract class DictionaryBase : Dictionary { /// /// Read a key as the specified type, returning null on error /// public T? Read(string key) { if (string.IsNullOrWhiteSpace(key)) return default; if (!ContainsKey(key)) return default; return (T?)this[key]; } /// /// Read a key as a bool, returning null on error /// public bool? ReadBool(string key) { bool? asBool = Read(key); if (asBool != null) return asBool; string? asString = Read(key); return asString?.ToLowerInvariant() switch { "true" => true, "yes" => true, "false" => false, "no" => false, _ => null, }; } /// /// Read a key as a double, returning null on error /// public double? ReadDouble(string key) { double? asDouble = Read(key); if (asDouble != null) return asDouble; string? asString = Read(key); if (asString != null && double.TryParse(asString, out double asStringDouble)) return asStringDouble; return null; } /// /// Read a key as a long, returning null on error /// public long? ReadLong(string key) { long? asLong = Read(key); if (asLong != null) return asLong; string? asString = Read(key); if (asString != null && long.TryParse(asString, out long asStringLong)) return asStringLong; return null; } /// /// Read a key as a string, returning null on error /// public string? ReadString(string key) { string? asString = Read(key); if (asString != null) return asString; string[]? asArray = Read(key); if (asArray != null) return string.Join(',', asArray); return null; } /// /// Read a key as a string[], returning null on error /// public string[]? ReadStringArray(string key) { string[]? asArray = Read(key); if (asArray != null) return asArray; string? asString = Read(key); if (asString != null) return new string[] { asString }; return null; } } }