namespace PkmnLib.Static.Utils; /// <summary> /// A case-insensitive string key. We use this class for things like looking up data from dictionaries, etc. /// </summary> /// <remarks> /// This is a struct, as it's effectively just a wrapper around a single reference object. Heap allocation would be silly. /// </remarks> public readonly record struct StringKey { private readonly string _key; /// <inheritdoc cref="StringKey"/> public StringKey(string key) { if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("Key cannot be null or whitespace.", nameof(key)); _key = key; } /// <summary> /// Converts a <see cref="StringKey"/> to a <see cref="string"/>. /// </summary> public static implicit operator string(StringKey key) => key._key; /// <summary> /// Converts a <see cref="string"/> to a <see cref="StringKey"/>. /// </summary> public static implicit operator StringKey(string key) { return string.IsNullOrWhiteSpace(key) ? default : new StringKey(key); } /// <inheritdoc cref="string.ToString()"/> public override string ToString() => _key.ToLowerInvariant(); /// <inheritdoc /> public bool Equals(StringKey other) => string.Equals(_key, other._key, StringComparison.InvariantCultureIgnoreCase); /// <inheritdoc /> public override int GetHashCode() => StringComparer.InvariantCultureIgnoreCase.GetHashCode(_key); }