Skip to main content

war_pigeon/
message.rs

1use crate::Error;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use tracing::error;
5
6#[derive(Clone, Debug, Deserialize, Serialize)]
7#[serde(tag = "type", content = "data")]
8pub enum Message {
9    Custom(Value),
10
11    #[cfg(feature = "discord")]
12    Discord(Box<crate::messages::discord::DiscordMessage>),
13}
14impl Message {
15    /// Deliver a [`Message`] with War Pigeon.
16    ///
17    /// NOTE: We recommend using [`crate::Client::deliver()`] to send a [`Message`]
18    /// over this method, as this will initiate a new HTTP client for every call.
19    pub async fn deliver(self) -> Result<(), Error> {
20        let http_client = reqwest::Client::new();
21        Self::send(self, &http_client).await
22    }
23
24    /// Send the [`Message`] to the War Pigeon API.
25    pub(crate) async fn send(self, http_client: &reqwest::Client) -> Result<(), Error> {
26        let json_payload = serde_json::to_string(&self)
27            .inspect_err(|e| error!("failed to parse `Message` into json string: {e}"))?;
28
29        http_client
30            .post("https://war-pigeon.byte-forge.io/message")
31            .header("Content-type", "application/json")
32            .body(json_payload)
33            .send()
34            .await?
35            .error_for_status()?;
36
37        Ok(())
38    }
39
40    pub fn into_json(self) -> Result<String, Error> {
41        let json_data = match self {
42            Message::Custom(v) => serde_json::to_string(&v),
43
44            #[cfg(feature = "discord")]
45            Message::Discord(msg) => serde_json::to_string(&msg),
46        }?;
47
48        Ok(json_data)
49    }
50}