// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace EpicGames.Horde.Issues { /// /// Entry in an issue's metadata collection. Implemented as a case-insensitive key and value /// public class IssueMetadata : IEquatable { /// /// Key for the metadata item /// public string Key { get; } /// /// Value for the metadata /// public string Value { get; } /// /// Constructor /// [JsonConstructor] public IssueMetadata(string key, string value) { Key = key; Value = value; } /// public override int GetHashCode() => HashCode.Combine(Key.GetHashCode(StringComparison.OrdinalIgnoreCase), Value.GetHashCode(StringComparison.OrdinalIgnoreCase)); /// public override bool Equals(object? obj) => obj is IssueMetadata entry && Equals(entry); /// public bool Equals(IssueMetadata? entry) => entry is not null && Key.Equals(entry.Key, StringComparison.OrdinalIgnoreCase) && Value.Equals(entry.Value, StringComparison.OrdinalIgnoreCase); /// public override string ToString() => $"{Key}={Value}"; } /// /// Extension methods for /// public static class IssueMetadataEntryExtensions { /// /// Adds a new entry to a set /// public static void Add(this HashSet entries, string key, string value) { entries.Add(new IssueMetadata(key, value)); } /// /// Gets all the metadata values with a given key /// /// Set of entries to search /// Key name to search for /// All values with the given key public static IEnumerable FindValues(this IReadOnlySet entries, string key) { foreach (IssueMetadata entry in entries) { if (entry.Key.Equals(key, StringComparison.OrdinalIgnoreCase)) { yield return entry.Value; } } } } }