// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.ComponentModel; using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; using EpicGames.Core; using EpicGames.Serialization; namespace EpicGames.Horde.Storage { /// /// Identifier for a storage bucket /// [JsonConverter(typeof(BucketIdJsonConverter))] [TypeConverter(typeof(BucketIdTypeConverter))] [CbConverter(typeof(BucketIdCbConverter))] public struct BucketId : IEquatable { /// /// The text representing this id /// readonly StringId _inner; /// /// Constructor /// /// Unique id for the string public BucketId(string input) { StringId id; if (!StringId.TryParse(new Utf8String(input), MaxLength, out id, out string? errorMessage)) { throw new ArgumentException(errorMessage, nameof(input)); } _inner = id; } /// public override bool Equals(object? obj) => obj is BucketId id && _inner.Equals(id._inner); /// public override int GetHashCode() => _inner.GetHashCode(); /// public bool Equals(BucketId other) => _inner.Equals(other._inner); /// public override string ToString() => _inner.ToString(); /// public static bool operator ==(BucketId left, BucketId right) => left._inner == right._inner; /// public static bool operator !=(BucketId left, BucketId right) => left._inner != right._inner; // Increase the max length compared to normal string ids private const int MaxLength = 256; } /// /// Type converter for BucketId to and from JSON /// sealed class BucketIdJsonConverter : JsonConverter { /// public override BucketId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => new BucketId(reader.GetString() ?? string.Empty); /// public override void Write(Utf8JsonWriter writer, BucketId value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString()); } /// /// Type converter from strings to BucketId objects /// sealed class BucketIdTypeConverter : TypeConverter { /// public override bool CanConvertFrom(ITypeDescriptorContext? context, Type? sourceType) => sourceType == typeof(string); /// public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object? value) => new BucketId((string)value!); } sealed class BucketIdCbConverter : CbConverter { public override BucketId Read(CbField field) => new BucketId(field.AsString()); /// public override void Write(CbWriter writer, BucketId value) => writer.WriteStringValue(value.ToString()); /// public override void WriteNamed(CbWriter writer, CbFieldName name, BucketId value) => writer.WriteString(name, value.ToString()); } }