collaboflow_rs/client/document/
document_contents.rs

1use crate::authorization::HEADER_KEY;
2use crate::client::document::RESOURCE_V1_DOCUMENTS;
3use crate::response::document::document_contents::{
4    GetDocumentContentsResponse, GetDocumentContentsResponseBody,
5};
6use crate::response::error::{ErrorResponse, ErrorResponseBody};
7use crate::Query;
8
9const NESTED_RESOURCE: &str = "contents";
10
11#[derive(Debug, Clone)]
12pub struct DocumentContents {
13    url: String,
14    authorization_header: String,
15}
16
17impl DocumentContents {
18    pub fn new(url: &str, authorization_header: &str) -> Self {
19        Self {
20            url: url.to_string() + RESOURCE_V1_DOCUMENTS,
21            authorization_header: authorization_header.to_string(),
22        }
23    }
24
25    pub async fn get(
26        &self,
27        document_id: i32,
28        query: Query,
29    ) -> Result<GetDocumentContentsResponse, ErrorResponse> {
30        let request_url = format!("{}/{}/{}", &self.url, document_id, NESTED_RESOURCE,);
31
32        let http_client = reqwest::Client::new();
33        let result = http_client
34            .get(request_url)
35            .query(&query.to_queries())
36            .header(HEADER_KEY, &self.authorization_header)
37            .send()
38            .await;
39
40        match result {
41            Ok(resp) => {
42                let status = resp.status().as_u16();
43
44                if status == 200 {
45                    match resp.json::<GetDocumentContentsResponseBody>().await {
46                        Ok(body) => Ok(GetDocumentContentsResponse { status, body }),
47                        Err(err) => {
48                            let body = ErrorResponseBody {
49                                error: true,
50                                messages: vec![err.to_string()],
51                            };
52                            let error_response = ErrorResponse { status, body };
53                            Err(error_response)
54                        }
55                    }
56                } else {
57                    match resp.json::<ErrorResponseBody>().await {
58                        Ok(body) => {
59                            let error_response = ErrorResponse { status, body };
60                            Err(error_response)
61                        }
62                        Err(err) => {
63                            let body = ErrorResponseBody {
64                                error: true,
65                                messages: vec![err.to_string()],
66                            };
67                            let error_response = ErrorResponse { status, body };
68                            Err(error_response)
69                        }
70                    }
71                }
72            }
73            Err(err) => {
74                let body = ErrorResponseBody {
75                    error: true,
76                    messages: vec![err.to_string()],
77                };
78                let error_response = ErrorResponse { status: 500, body };
79                Err(error_response)
80            }
81        }
82    }
83}