42 lines
1.4 KiB
C#
42 lines
1.4 KiB
C#
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
using YandexMusic.API.Common;
|
|
|
|
namespace YandexMusic.API.Models.Common;
|
|
|
|
/// <summary>Конвертер для внедрения контекста выполнения (API и хранилище) в модели.</summary>
|
|
public class YExecutionContextConverter : JsonConverter<YBaseModel>
|
|
{
|
|
private readonly YandexMusicApi _api;
|
|
private readonly AuthStorage _storage;
|
|
|
|
public YExecutionContextConverter(YandexMusicApi api, AuthStorage storage)
|
|
{
|
|
_api = api;
|
|
_storage = storage;
|
|
}
|
|
|
|
public override YBaseModel? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
{
|
|
// Десериализуем объект без контекста
|
|
var obj = (YBaseModel?)JsonSerializer.Deserialize(ref reader, typeToConvert, options);
|
|
if (obj != null)
|
|
{
|
|
obj.Context = new YExecutionContext
|
|
{
|
|
API = _api,
|
|
Storage = _storage
|
|
};
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
public override void Write(Utf8JsonWriter writer, YBaseModel value, JsonSerializerOptions options)
|
|
{
|
|
// При сериализации игнорируем контекст
|
|
var cloneOptions = new JsonSerializerOptions(options);
|
|
cloneOptions.Converters.Remove(this);
|
|
JsonSerializer.Serialize(writer, value, cloneOptions);
|
|
}
|
|
}
|