// 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;
}
}
}
}
}