using System.Xml;
using System.Xml.Serialization;
namespace YandexMusic.API.Requests.Common;
///
/// Строитель запросов с десериализацией XML-ответа в TResponse.
///
internal abstract class YXmlRequestBuilder : YRequestBuilder
{
protected YXmlRequestBuilder(YandexMusicApi api) : base(api) { }
///
/// Десериализует XML-ответ в объект типа TResponse.
///
protected virtual async Task DeserializeAsync(HttpResponseMessage response)
{
var xml = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
// Для XML-ошибок можно создать отдельную модель, но для простоты выбрасываем исключение
throw new Exception($"Ошибка HTTP {response.StatusCode}: {xml}");
}
try
{
using var stringReader = new StringReader(xml);
using var xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings { Async = true });
var serializer = new XmlSerializer(typeof(TResponse));
return (TResponse?)serializer.Deserialize(xmlReader);
}
catch (Exception ex)
{
throw new Exception($"Ошибка десериализации XML: {ex.Message}\nXML: {xml}", ex);
}
}
///
/// Выполняет запрос и возвращает десериализованный объект типа TResponse.
///
public async Task ExecuteAsync(TParams parameters)
{
using var response = await ExecuteRawAsync(parameters);
return await DeserializeAsync(response);
}
}