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 pub async fn deliver(self) -> Result<(), Error> {
20 let http_client = reqwest::Client::new();
21 Self::send(self, &http_client).await
22 }
23
24 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}