simplex_chat/
types.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value as JsonValue;
3use std::collections::HashMap;
4
5#[derive(Serialize, Deserialize, Debug, Clone)]
6#[serde(rename_all = "camelCase")]
7pub struct LocalProfile {
8    pub profile_id: u64,
9    pub display_name: String,
10    pub full_name: String,
11    pub image: Option<String>,
12    pub contact_link: Option<String>,
13    pub local_alias: String,
14    #[serde(flatten)]
15    pub _unknown_fields: HashMap<String, JsonValue>,
16}
17
18#[derive(Serialize, Deserialize, Debug, Clone)]
19#[serde(rename_all = "camelCase")]
20pub struct User {
21    pub user_id: u64,
22    pub agent_user_id: String,
23    pub user_contact_id: u64,
24    pub local_display_name: String,
25    pub profile: LocalProfile,
26    pub active_user: bool,
27    // view_pwd_hash: String, // Declared in the typescript API, but not sent by server
28    pub show_ntfs: bool,
29    #[serde(flatten)]
30    pub _unknown_fields: HashMap<String, JsonValue>,
31}
32
33#[derive(Serialize, Deserialize, Debug, Clone)]
34#[serde(rename_all = "camelCase")]
35pub struct UserInfo {
36    pub user: User,
37    pub unread_count: u64,
38    #[serde(flatten)]
39    pub _unknown_fields: HashMap<String, JsonValue>,
40}
41
42#[derive(Serialize, Deserialize, Debug, Clone)]
43#[serde(rename_all = "camelCase")]
44pub struct Contact {
45    pub contact_id: u64,
46    pub local_display_name: String,
47    // profile: Profile,
48    // active_conn: Connection,
49    pub via_group: Option<u64>,
50    // created_at: Date,
51    #[serde(flatten)]
52    pub _unknown_fields: HashMap<String, JsonValue>,
53}
54
55#[derive(Serialize, Deserialize, Debug, Clone)]
56#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
57#[serde(tag = "type")]
58pub enum ChatInfo {
59    Direct {
60        contact: Contact,
61        #[serde(flatten)]
62        _unknown_fields: HashMap<String, JsonValue>,
63    },
64    Group {
65        group_info: GroupInfo,
66        #[serde(flatten)]
67        _unknown_fields: HashMap<String, JsonValue>,
68    },
69    ContactRequest {
70        #[serde(flatten)]
71        _unknown_fields: HashMap<String, JsonValue>,
72    },
73    #[serde(untagged)]
74    Unknown(JsonValue),
75}
76
77#[derive(Serialize, Deserialize, Debug, Clone)]
78#[serde(rename_all = "camelCase")]
79pub struct GroupInfo {
80    pub group_id: u64,
81    pub local_display_name: String,
82    pub group_profile: GroupProfile,
83    pub membership: GroupMember,
84    // pub created_at: Date, // TODO: Pick date type
85    #[serde(flatten)]
86    pub _unknown_fields: HashMap<String, JsonValue>,
87}
88
89#[derive(Serialize, Deserialize, Debug, Clone)]
90#[serde(rename_all = "camelCase")]
91pub struct GroupProfile {
92    pub display_name: String,
93    pub full_name: String,
94    pub image: Option<String>,
95    #[serde(flatten)]
96    pub _unknown_fields: HashMap<String, JsonValue>,
97}
98
99#[derive(Serialize, Deserialize, Debug, Clone)]
100#[serde(rename_all = "camelCase")]
101pub struct GroupMember {
102    pub group_member_id: u64,
103    pub member_id: String,
104    pub member_role: GroupMemberRole,
105    pub local_display_name: String,
106    pub member_profile: Profile,
107    pub member_contact_id: Option<u64>,
108    pub active_conn: Option<Connection>,
109    #[serde(flatten)]
110    pub _unknown_fields: HashMap<String, JsonValue>,
111}
112
113#[derive(Serialize, Deserialize, Debug, Clone)]
114#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
115pub enum GroupMemberRole {
116    Member,
117    Admin,
118    Owner,
119}
120
121#[derive(Serialize, Deserialize, Debug, Clone)]
122#[serde(rename_all = "camelCase")]
123pub struct Profile {
124    display_name: String,
125    full_name: String,
126    image: Option<String>,
127    contact_link: Option<String>,
128    #[serde(flatten)]
129    pub _unknown_fields: HashMap<String, JsonValue>,
130}
131
132#[derive(Serialize, Deserialize, Debug, Clone)]
133#[serde(rename_all = "camelCase")]
134pub struct AChatItem {
135    pub chat_info: ChatInfo,
136    pub chat_item: ChatItem,
137    #[serde(flatten)]
138    pub _unknown_fields: HashMap<String, JsonValue>,
139}
140
141#[derive(Serialize, Deserialize, Debug, Clone)]
142#[serde(rename_all = "camelCase")]
143pub struct ChatItem {
144    pub chat_dir: Direction,
145    pub meta: Meta,
146    // pub content: CIContent,
147    // pub formatted_text: Option<Vec<FormattedText>>,
148    // pub quoted_item: Option<CIQuote>
149    #[serde(flatten)]
150    pub _unknown_fields: HashMap<String, JsonValue>,
151}
152
153#[derive(Serialize, Deserialize, Debug, Clone)]
154#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
155#[serde(tag = "type")]
156pub enum Direction {
157    DirectSnd,
158    DirectRcv,
159    GroupSnd,
160    GroupRcv {
161        group_member: GroupMember,
162    },
163    #[serde(untagged)]
164    Unknown(JsonValue),
165}
166
167#[derive(Serialize, Deserialize, Debug, Clone)]
168#[serde(rename_all = "camelCase")]
169pub struct Meta {
170    pub item_id: u64,
171    // item_ts: Date, // TODO: Pick date
172    pub item_text: String,
173    // item_status: CIStatus,
174    // created_at: Date,
175    // pub item_deleted: bool,
176    pub item_edited: bool,
177    pub editable: bool,
178    #[serde(flatten)]
179    pub _unknown_fields: HashMap<String, JsonValue>,
180}
181
182#[derive(Serialize, Deserialize, Debug, Clone)]
183#[serde(rename_all = "camelCase")]
184pub struct Chat {
185    pub chat_info: ChatInfo,
186    // chat_items: Vec<ChatItem>,
187    // chat_stats: ChatStats,
188    #[serde(flatten)]
189    pub _unknown_fields: HashMap<String, JsonValue>,
190}
191
192#[derive(Serialize, Deserialize, Debug, Clone)]
193#[serde(rename_all = "camelCase")]
194pub struct UserContactLink {
195    pub conn_req_contact: String,
196    pub auto_accept: Option<AutoAccept>,
197    #[serde(flatten)]
198    pub _unknown_fields: HashMap<String, JsonValue>,
199}
200
201#[derive(Serialize, Deserialize, Debug, Clone)]
202#[serde(rename_all = "camelCase")]
203pub struct AutoAccept {
204    pub accept_incognito: bool,
205    pub auto_reply: Option<MsgContent>,
206    #[serde(flatten)]
207    pub _unknown_fields: HashMap<String, JsonValue>,
208}
209
210#[derive(Serialize, Deserialize, Debug, Clone)]
211#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
212pub enum MsgContent {
213    Text {
214        text: String,
215        #[serde(flatten)]
216        _unknown_fields: HashMap<String, JsonValue>,
217    },
218    Link {
219        text: String,
220        #[serde(flatten)]
221        _unknown_fields: HashMap<String, JsonValue>,
222    },
223    Image {
224        image: String, // Base64 string
225        #[serde(flatten)]
226        _unknown_fields: HashMap<String, JsonValue>,
227    },
228    File {
229        text: String,
230        #[serde(flatten)]
231        _unknown_fields: HashMap<String, JsonValue>,
232    },
233    Unknown(JsonValue),
234}
235
236#[derive(Serialize, Deserialize, Debug, Clone)]
237#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
238#[serde(tag = "type")]
239pub enum ChatError {
240    Error {
241        error_type: ChatErrorType,
242        #[serde(flatten)]
243        _unknown_fields: HashMap<String, JsonValue>,
244    },
245    ErrorAgent {
246        agent_error: JsonValue,
247        #[serde(flatten)]
248        _unknown_fields: HashMap<String, JsonValue>,
249    },
250    ErrorStore {
251        store_error: JsonValue,
252    },
253    Unknown(JsonValue),
254}
255
256#[derive(Serialize, Deserialize, Debug, Clone)]
257#[serde(rename_all = "camelCase", rename_all_fields = "camelCase")]
258pub enum ChatErrorType {
259    NoActiveUser,
260    ActiveUserExists,
261}
262
263#[derive(Serialize, Deserialize, Debug, Clone)]
264#[serde(rename_all = "camelCase")]
265pub struct Connection {
266    pub conn_id: u64,
267}