response.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from typing import TYPE_CHECKING, Optional
  2. from yandex_music import YandexMusicModel
  3. from yandex_music.utils import model
  4. if TYPE_CHECKING:
  5. from yandex_music import ClientType, InvocationInfo, JSONType
  6. @model
  7. class Response(YandexMusicModel):
  8. """Класс, представляющий ответ API.
  9. Note:
  10. У ответа сервера два варианта возврата данных. Через корень (без вложенности, на уровне `invocation_info`)
  11. используется от силы пару раз. И в поле `result`. Второй считается основным.
  12. В `data` лежит копия всего ответа.
  13. Attributes:
  14. data (:obj:`dict`): Ответ на запрос. Используется тогда, когда отсутствует `result`.
  15. invocation_info (:obj:`yandex_music.InvocationInfo`, optional): Информация о запросе.
  16. result (:obj:`dict`, optional): Ответ на запрос (секция с результатом).
  17. error (:obj:`str`, optional): Код ошибки.
  18. error_description (:obj:`str`, optional): Описание ошибки.
  19. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  20. """
  21. data: 'JSONType'
  22. invocation_info: Optional['InvocationInfo'] = None
  23. result: Optional['JSONType'] = None
  24. error: Optional[str] = None
  25. error_description: Optional[str] = None
  26. client: Optional['ClientType'] = None
  27. def get_error(self) -> str:
  28. """:obj:`str`: Код ошибки вместе с описанием"""
  29. return f'{self.error} {self.error_description if self.error_description else ""}'
  30. def get_result(self) -> 'JSONType':
  31. """:obj:`dict`: Результат выполнения запроса. Данный для распаковки."""
  32. return self.data if self.result is None else self.result
  33. @classmethod
  34. def de_json(cls, data: 'JSONType', client: 'ClientType') -> Optional['Response']:
  35. """Десериализация объекта.
  36. Args:
  37. data (:obj:`dict`): Поля и значения десериализуемого объекта.
  38. client (:obj:`yandex_music.Client`, optional): Клиент Yandex Music.
  39. Returns:
  40. :obj:`yandex_music.utils.response.Response`: Ответ API.
  41. """
  42. if not cls.is_dict_model_data(data):
  43. return None
  44. cls_data = cls.cleanup_data(data, client)
  45. cls_data['data'] = data.copy()
  46. from yandex_music import InvocationInfo
  47. cls_data['invocation_info'] = InvocationInfo.de_json(data.get('invocation_info'), client)
  48. return cls(client=client, **cls_data) # type: ignore