octocrate_core/
response.rs1use 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}