using System.Text.Json; using System.Text.Json.Serialization; using YandexMusic.API.Common; using YandexMusic.API.Models.Common; namespace YandexMusic.API.Converters; /// /// Конвертер для внедрения контекста выполнения (API и хранилище) в модели, наследуемые от YBaseModel. /// public class YExecutionContextConverter : JsonConverter { private readonly YandexMusicApi _api; private readonly AuthStorage _storage; /// /// Инициализирует новый экземпляр конвертера. /// /// Экземпляр основного API. /// Хранилище авторизации. public YExecutionContextConverter(YandexMusicApi api, AuthStorage storage) { _api = api; _storage = storage; } /// public override bool CanConvert(Type typeToConvert) => typeof(YBaseModel).IsAssignableFrom(typeToConvert); /// public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // Убираем этот конвертер из опций, чтобы избежать рекурсии var innerOptions = new JsonSerializerOptions(options); innerOptions.Converters.Remove(this); var obj = JsonSerializer.Deserialize(ref reader, typeToConvert, innerOptions); if (obj is YBaseModel baseModel) { baseModel.Context = new YExecutionContext { Api = _api, Storage = _storage }; } return obj; } /// public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) { var innerOptions = new JsonSerializerOptions(options); innerOptions.Converters.Remove(this); JsonSerializer.Serialize(writer, value, innerOptions); } }