using System.ComponentModel; using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; namespace IdentityShroud.Core.Security; [JsonConverter(typeof(KekIdJsonConverter))] [TypeConverter(typeof(KekIdTypeConverter))] public readonly record struct KekId { public Guid Id { get; } public KekId(Guid id) { Id = id; } public static KekId NewId() { return new KekId(Guid.NewGuid()); } } public class KekIdJsonConverter : JsonConverter { public override KekId Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => new KekId(reader.GetGuid()); public override void Write(Utf8JsonWriter writer, KekId value, JsonSerializerOptions options) => writer.WriteStringValue(value.Id); } public class KekIdTypeConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) => sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) => value is string s ? new KekId(Guid.Parse(s)) : base.ConvertFrom(context, culture, value); }