discord_presence/models/
payload.rs

1use super::{Command, Event, Message};
2use serde::{de::DeserializeOwned, Serialize};
3
4/// The Discord client payload
5#[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
6pub struct Payload<T>
7where
8    T: Serialize,
9{
10    /// The payload command
11    pub cmd: Command,
12
13    /// The payload args
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub args: Option<T>,
16
17    /// The payload data
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub data: Option<T>,
20
21    /// The payload event
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub evt: Option<Event>,
24
25    /// The payload nonce
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub nonce: Option<String>,
28}
29
30impl<T> Payload<T>
31where
32    T: Serialize,
33{
34    /// Create a `Payload`, by generating a nonce
35    pub fn with_nonce(cmd: Command, args: Option<T>, data: Option<T>, evt: Option<Event>) -> Self {
36        Self {
37            cmd,
38            args,
39            data,
40            evt,
41            nonce: Some(crate::nonce()),
42        }
43    }
44}
45
46impl<T> From<Message> for Payload<T>
47where
48    T: Serialize + DeserializeOwned,
49{
50    fn from(message: Message) -> Self {
51        serde_json::from_str(&message.payload).unwrap()
52    }
53}