Skip to main content

threads_rs/api/
posts_delete.rs

1use crate::client::Client;
2use crate::constants;
3use crate::error;
4use crate::types::PostId;
5
6/// Response from the delete post endpoint.
7#[derive(Debug, serde::Deserialize)]
8struct DeleteResponse {
9    /// Whether the delete was successful. `None` when the field is absent.
10    #[serde(default)]
11    success: Option<bool>,
12    /// The deleted post's ID.
13    #[serde(default)]
14    deleted_id: Option<String>,
15}
16
17impl Client {
18    /// Delete a post by ID. Returns the deleted post ID.
19    pub async fn delete_post(&self, post_id: &PostId) -> crate::Result<String> {
20        if !post_id.is_valid() {
21            return Err(error::new_validation_error(
22                0,
23                constants::ERR_EMPTY_POST_ID,
24                "",
25                "post_id",
26            ));
27        }
28
29        let token = self.access_token().await;
30        let path = format!("/{}", post_id);
31        let resp = self.http_client.delete(&path, &token).await?;
32
33        if let Ok(del_resp) = serde_json::from_slice::<DeleteResponse>(&resp.body) {
34            if del_resp.success == Some(false) {
35                return Err(error::new_api_error(
36                    0,
37                    "Delete request returned success=false",
38                    "",
39                    "",
40                ));
41            }
42            if let Some(id) = del_resp.deleted_id {
43                return Ok(id);
44            }
45        }
46
47        Ok(post_id.to_string())
48    }
49}