using System.Text.Json; using System.Text.Json.Serialization; namespace YandexMusic.API.Models.Radio.Restriction; /// Конвертер для ограничений радиостанции (дискретная шкала или перечисление). public class YRestrictionConverter : JsonConverter { public override YRestriction? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException("Ожидается объект ограничения"); using var doc = JsonDocument.ParseValue(ref reader); var root = doc.RootElement; var typeProp = root.GetProperty("type"); var typeStr = typeProp.GetString(); if (!Enum.TryParse(typeStr, true, out var restrictionType)) throw new JsonException($"Неизвестный тип ограничения: {typeStr}"); var rawText = root.GetRawText(); return restrictionType switch { YRestrictionType.Enum => JsonSerializer.Deserialize(rawText, options), YRestrictionType.DiscreteScale => JsonSerializer.Deserialize(rawText, options), _ => JsonSerializer.Deserialize(rawText, options) }; } public override void Write(Utf8JsonWriter writer, YRestriction value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }