Files
YandexMusic/YandexMusic.API/Models/Common/YExecutionContextConverter.cs
FrigaT 36e28ce3fe
All checks were successful
Release / pack-and-publish (release) Successful in 36s
Полностью переписанное api
2026-04-19 17:00:05 +03:00

53 lines
2.0 KiB
C#

using System.Text.Json;
using System.Text.Json.Serialization;
using YandexMusic.API.Common;
using YandexMusic.API.Models.Common;
namespace YandexMusic.API.Converters;
/// <summary>
/// Конвертер для внедрения контекста выполнения (API и хранилище) в модели, наследуемые от YBaseModel.
/// </summary>
public class YExecutionContextConverter : JsonConverter<object>
{
private readonly YandexMusicApi _api;
private readonly AuthStorage _storage;
/// <summary>
/// Инициализирует новый экземпляр конвертера.
/// </summary>
/// <param name="api">Экземпляр основного API.</param>
/// <param name="storage">Хранилище авторизации.</param>
public YExecutionContextConverter(YandexMusicApi api, AuthStorage storage)
{
_api = api;
_storage = storage;
}
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert) =>
typeof(YBaseModel).IsAssignableFrom(typeToConvert);
/// <inheritdoc />
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;
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
{
var innerOptions = new JsonSerializerOptions(options);
innerOptions.Converters.Remove(this);
JsonSerializer.Serialize(writer, value, innerOptions);
}
}