signald_rust/
signaldresponse.rs

1use serde::Serialize;
2use serde::Deserialize;
3use serde_json::Value;
4use std::collections::HashMap;
5use crate::signaldresponse::ResponseType::{Version, Unknown};
6
7/// Indicates which kind of Signald message is received
8#[derive(Clone)]
9pub enum ResponseType {
10    BusUpdate,
11    Message(Option<MessageData>),
12    Version(Option<VersionData>),
13    ContactList(Option<Vec<Account>>),
14    LinkingUri(Option<LinkingUri>),
15    LinkingError(Option<LinkingError>),
16    Subscribed,
17    Unsubscribed,
18    /// An unknown response
19    /// String parameter is the type
20    /// Value parameter is a Value of the data
21    Unknown(String, Value),
22}
23impl ResponseType {
24    /// Create a ResponseType from response data
25    pub fn new(typ: &str, val: &Value) -> ResponseType {
26        return match typ {
27            "contact_list" => {
28                let data = serde_json::from_value(val.clone()).unwrap();
29                ResponseType::ContactList(data)
30            }
31            "version" => {
32                let data = serde_json::from_value(val.clone()).unwrap();
33                Version(data)
34            }
35            "message" => {
36                let data = serde_json::from_value(val.clone()).unwrap();
37                ResponseType::Message(data)
38            }
39            "linking_uri" => {
40                let data = serde_json::from_value(val.clone()).unwrap();
41                ResponseType::LinkingUri(data)
42            }
43            "linking_error" => {
44                let data = serde_json::from_value(val.clone()).unwrap();
45                ResponseType::LinkingError(data)
46            }
47            "subscribed" => ResponseType::Subscribed,
48            "unsubscribed" => ResponseType::Unsubscribed,
49            _ => Unknown(typ.to_string(), val.clone())
50        }
51
52    }
53}
54
55/// A Signald response
56#[derive(Clone)]
57pub struct SignaldResponse {
58    pub id: Option<String>,
59    pub data: ResponseType,
60}
61impl SignaldResponse {
62    pub fn from_value(val: Value) -> SignaldResponse {
63        let id = val["id"].as_str().map(|x| x.to_string());
64
65        let data: ResponseType = ResponseType::new(val["type"].as_str().unwrap(), &val["data"]);
66
67        SignaldResponse {
68            id,
69            data
70        }
71
72    }
73}
74
75pub trait ResponseData {}
76
77// ========================================= VERSION ===============================================
78#[derive(Serialize, Deserialize, Default, Clone)]
79pub struct VersionData {
80    #[serde(rename = "name")]
81    pub name: String,
82    #[serde(rename = "version")]
83    pub version: String,
84    #[serde(rename = "branch")]
85    pub branch: String,
86    #[serde(rename = "commit")]
87    pub commit: String,
88}
89
90// ========================================= MESSAGE ===============================================
91#[derive(Serialize, Deserialize, Default, Clone)]
92pub struct MessageData {
93    #[serde(rename = "username")]
94    pub username: Option<String>,
95    #[serde(rename = "uuid")]
96    pub uuid: Option<String>,
97    #[serde(rename = "source")]
98    pub source: Option<String>,
99    #[serde(rename = "sourceDevice")]
100    pub source_device: Option<i32>,
101    #[serde(rename = "type")]
102    pub typ: i32,
103    #[serde(rename = "timestamp")]
104    pub timestamp: i64,
105    #[serde(rename = "timestampISO")]
106    pub timestamp_iso: String,
107    #[serde(rename = "serverTimestamp")]
108    pub server_timestamp: i64,
109    #[serde(rename = "hasLegacyMessage")]
110    pub has_legacy_message: bool,
111    #[serde(rename = "hasContent")]
112    pub has_content: bool,
113    #[serde(rename = "isSignalMessage")]
114    pub is_signal_message: Option<bool>,
115    #[serde(rename = "isPrekeySignalMessage")]
116    pub is_prekey_signal_message: Option<bool>,
117    #[serde(rename = "isReceipt")]
118    pub is_receipt: bool,
119    #[serde(rename = "isUnidentifiedSender")]
120    pub is_unidentified_sender: bool,
121    #[serde(rename = "syncMessage")]
122    pub sync_message: Option<SyncMessage>,
123    #[serde(rename = "dataMessage")]
124    pub data_message: Option<Message>,
125    #[serde(rename = "typing")]
126    pub typing: Option<Typing>,
127    #[serde(rename = "receipt")]
128    pub receipt: Option<Receipt>,
129}
130
131#[derive(Serialize, Deserialize, Default, Clone)]
132pub struct SyncMessage {
133    #[serde(rename = "sent")]
134    pub sent: Option<SentMessage>,
135    // #[serde(rename = "contacts")]
136    // pub contacts: Option<Contacts>,
137    #[serde(rename = "contactsComplete")]
138    pub contacts_complete: bool,
139    #[serde(rename = "readMessages")]
140    pub read_messages: Option<Vec<ReadMessage>>,
141    #[serde(rename = "stickerPackOperations")]
142    pub sticker_pack_operations: Option<Vec<String>>,
143    #[serde(rename = "unidentifiedStatus")]
144    pub unidentified_status: Option<HashMap<String, bool>>,
145    // #[serde(rename = "isRecipientUpdate")]
146    // pub is_recipient_update: bool,
147}
148
149#[derive(Serialize, Deserialize, Default, Clone)]
150pub struct Message {
151    #[serde(rename = "timestamp")]
152    pub timestamp: i64,
153    #[serde(rename = "message")]
154    pub message: String,
155    #[serde(rename = "expiresInSeconds")]
156    pub expires_in_seconds: i32,
157}
158#[derive(Serialize, Deserialize, Default, Clone)]
159pub struct SentMessage {
160    #[serde(rename = "destination")]
161    pub destination: String,
162    #[serde(rename = "timestamp")]
163    pub timestamp: i64,
164    #[serde(rename = "expirationStartTimestamp")]
165    pub expiration_start_timestamp: i64,
166    #[serde(rename = "message")]
167    pub message: Message,
168    #[serde(rename = "unidentifiedStatus")]
169    pub unidentified_status: HashMap<String, bool>,
170    #[serde(rename = "isRecipientUpdate")]
171    pub is_recipient_update: bool,
172}
173#[derive(Serialize, Deserialize, Default, Clone)]
174pub struct ReadMessage {
175    #[serde(rename = "sender")]
176    pub sender: String,
177    #[serde(rename = "timestamp")]
178    pub timestamp: i64,
179}
180#[derive(Serialize, Deserialize, Default, Clone)]
181pub struct Typing {
182    #[serde(rename = "action")]
183    pub action: String,
184    #[serde(rename = "timestamp")]
185    pub timestamp: i64,
186}
187#[derive(Serialize, Deserialize, Default, Clone)]
188pub struct Receipt {
189    #[serde(rename = "type")]
190    pub typ: String,
191    #[serde(rename = "timestamps")]
192    pub timestamps: Vec<u64>,
193    #[serde(rename = "when")]
194    pub when: u64,
195}
196
197// ==================================== CONTACT LIST ===============================================
198#[derive(Serialize, Deserialize, Default, Clone)]
199pub struct ContactListData {
200    #[serde(flatten)]
201    pub contacts: Vec<Account>
202}
203#[derive(Serialize, Deserialize, Default, Clone)]
204pub struct Account {
205    pub name: Option<String>,
206    pub number: String,
207    pub color: String,
208    #[serde(rename = "profileKey")]
209    pub profile_key: Option<String>,
210}
211
212// ========================================= LINK ==================================================
213#[derive(Serialize, Deserialize, Default, Clone)]
214pub struct LinkingUri {
215    pub uri: String,
216}
217#[derive(Serialize, Deserialize, Default, Clone)]
218pub struct LinkingError {
219    pub msg_number: u32,
220    pub message: String,
221    pub error: bool,
222    pub request: Request,
223}
224#[derive(Serialize, Deserialize, Default, Clone)]
225pub struct Request {
226    #[serde(rename = "type")]
227    pub typ: String,
228    #[serde(rename = "expiresInSeconds")]
229    pub expires_in_seconds: u32,
230    pub when: u64,
231}
232