53 lines
2.0 KiB
C#
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);
|
|
}
|
|
} |