notion_client/endpoints/blocks/
retrieve.rs

1pub mod response;
2
3use crate::{
4    endpoints::NOTION_URI,
5    objects::{block::Block, Response},
6    NotionClientError,
7};
8
9use self::response::RetrieveBlockChilerenResponse;
10
11use super::BlocksEndpoint;
12
13impl BlocksEndpoint {
14    pub async fn retrieve_a_block(&self, block_id: &str) -> Result<Block, NotionClientError> {
15        let result = self
16            .client
17            .get(format!(
18                "{notion_uri}/blocks/{block_id}",
19                notion_uri = NOTION_URI,
20            ))
21            .send()
22            .await
23            .map_err(|e| NotionClientError::FailedToRequest { source: e })?;
24
25        let body = result
26            .text()
27            .await
28            .map_err(|e| NotionClientError::FailedToText { source: e })?;
29
30        let response = serde_json::from_str(&body)
31            .map_err(|e| NotionClientError::FailedToDeserialize { source: e, body })?;
32
33        match response {
34            Response::Success(r) => Ok(r),
35            Response::Error(e) => Err(NotionClientError::InvalidStatusCode { error: e }),
36        }
37    }
38
39    pub async fn retrieve_block_children(
40        &self,
41        block_id: &str,
42        start_cursor: Option<&str>,
43        page_size: Option<u32>,
44    ) -> Result<RetrieveBlockChilerenResponse, NotionClientError> {
45        let mut query = vec![];
46        if let Some(start_cursor) = start_cursor {
47            query.insert(0, ("start_cursor", start_cursor));
48        }
49        let page_size = page_size.map(|p| p.to_string());
50        if let Some(page_size) = &page_size {
51            query.insert(0, ("page_size", page_size));
52        }
53
54        let result = self
55            .client
56            .get(format!(
57                "{notion_uri}/blocks/{block_id}/children",
58                notion_uri = NOTION_URI,
59            ))
60            .query(&query)
61            .send()
62            .await
63            .map_err(|e| NotionClientError::FailedToRequest { source: e })?;
64
65        let body = result
66            .text()
67            .await
68            .map_err(|e| NotionClientError::FailedToText { source: e })?;
69
70        let response = serde_json::from_str(&body)
71            .map_err(|e| NotionClientError::FailedToDeserialize { source: e, body })?;
72
73        match response {
74            Response::Success(r) => Ok(r),
75            Response::Error(e) => Err(NotionClientError::InvalidStatusCode { error: e }),
76        }
77    }
78}