jellyfin_sdk_rust/
jellyfin_response.rs

1#[cfg(feature = "headers")]
2use reqwest::header::HeaderMap;
3
4use reqwest::{Response, Url};
5use serde::de::DeserializeOwned;
6
7use crate::{JellyfinSDKError, JellyfinSDKResult};
8
9/// Structure containing the request status code and a `Result` that may contain the body.
10pub struct JellyfinResponse<T> {
11    pub(crate) status: u16,
12    pub(crate) url: Url,
13    #[cfg(feature = "headers")]
14    pub(crate) headers: HeaderMap,
15    pub(crate) body: Result<T, reqwest::Error>,
16}
17
18impl<T> JellyfinResponse<T> {
19    pub fn status(&self) -> u16 {
20        self.status
21    }
22
23    pub fn url(&self) -> &Url {
24        &self.url
25    }
26
27    pub fn body(&self) -> &Result<T, reqwest::Error> {
28        &self.body
29    }
30
31    #[cfg(feature = "headers")]
32    pub fn headers(&self) -> &HeaderMap {
33        &self.headers
34    }
35
36    pub(crate) async fn async_from(response: Response) -> JellyfinSDKResult<Self>
37    where
38        T: DeserializeOwned,
39    {
40        match response.error_for_status() {
41            Ok(res) => Ok(JellyfinResponse {
42                status: res.status().as_u16(),
43                url: res.url().clone(),
44                #[cfg(feature = "headers")]
45                headers: res.headers().clone(),
46                body: res.json::<T>().await,
47            }),
48            Err(err) => Err(JellyfinSDKError::ReqwestError(err)),
49        }
50    }
51}