octocrate_core/
response.rs

1use reqwest::{header::HeaderMap, StatusCode, Url, Version};
2
3#[derive(Clone)]
4pub struct GitHubResponse<ResponseData> {
5  pub data: ResponseData,
6  pub headers: HeaderMap,
7  pub status: StatusCode,
8  pub version: Version,
9  pub content_length: Option<u64>,
10  pub url: Url,
11}
12
13#[cfg(feature = "pagination")]
14#[derive(Clone)]
15pub struct GitHubPaginatedResponse<ResponseData> {
16  pub data: ResponseData,
17  pub headers: HeaderMap,
18  pub status: StatusCode,
19  pub version: Version,
20  pub content_length: Option<u64>,
21  pub url: Url,
22  pub pages: octocrate_types::LinkedPages,
23}
24
25#[cfg(feature = "pagination")]
26impl<ResponseData: serde::de::DeserializeOwned + IntoIterator>
27  GitHubPaginatedResponse<ResponseData>
28{
29  pub fn paginate(self) -> octocrate_types::PaginatedData<ResponseData> {
30    octocrate_types::PaginatedData {
31      data: self.data,
32      pages: self.pages,
33    }
34  }
35}
36
37#[cfg(feature = "pagination")]
38impl<ResponseData: serde::de::DeserializeOwned + IntoIterator> From<GitHubResponse<ResponseData>>
39  for GitHubPaginatedResponse<ResponseData>
40{
41  fn from(value: GitHubResponse<ResponseData>) -> Self {
42    let GitHubResponse::<ResponseData> {
43      data,
44      headers,
45      status,
46      version,
47      content_length,
48      url,
49    } = value;
50
51    Self {
52      data,
53      headers: headers.clone(),
54      status,
55      version,
56      content_length,
57      url,
58      pages: headers
59        .get("link")
60        .and_then(|header| header.to_str().ok())
61        .map(From::from)
62        .unwrap_or(Default::default()),
63    }
64  }
65}