1use serde::Serialize;
2use serde::Deserialize;
3use serde_json::Value;
4use std::collections::HashMap;
5use crate::signaldresponse::ResponseType::{Version, Unknown};
6
7#[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 Unknown(String, Value),
22}
23impl ResponseType {
24 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#[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#[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#[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 = "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 }
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#[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#[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