1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Deserialize, Serialize, Clone)]
5#[serde(tag = "type", content = "data")]
6pub enum Message {
7 #[serde(rename = "text")]
9 Text {
10 text: String,
12 },
13
14 #[serde(rename = "face")]
16 Face {
17 id: String,
19 },
20
21 #[serde(rename = "image")]
23 Image {
24 file: String,
26 #[serde(rename = "type")]
28 type_: Option<String>,
29 url: Option<String>,
31 cache: Option<u8>,
33 proxy: Option<u8>,
35 timeout: Option<i64>,
37 },
38
39 #[serde(rename = "record")]
41 Record {
42 file: String,
44 magic: Option<u8>,
46 url: Option<String>,
48 cache: Option<u8>,
50 proxy: Option<u8>,
52 timeout: Option<i64>,
54 },
55
56 #[serde(rename = "video")]
58 Video {
59 file: String,
61 url: Option<String>,
63 cache: Option<u8>,
65 proxy: Option<u8>,
67 timeout: Option<i64>,
69 },
70
71 #[serde(rename = "at")]
73 At {
74 qq: String,
76 },
77
78 #[serde(rename = "rps")]
80 Rps,
81
82 #[serde(rename = "dice")]
84 Dice,
85
86 #[serde(rename = "shake")]
88 Shake,
89
90 #[serde(rename = "poke")]
92 Poke {
93 #[serde(rename = "type")]
95 type_: String,
96 id: String,
98 name: Option<String>,
100 },
101
102 #[serde(rename = "anonymous")]
104 Anonymous,
105
106 #[serde(rename = "share")]
108 Share {
109 url: String,
111 title: String,
113 content: Option<String>,
115 image: Option<String>,
117 },
118
119 #[serde(rename = "contact")]
121 Contact {
122 #[serde(rename = "type")]
124 type_: String,
125 id: String,
127 },
128
129 #[serde(rename = "location")]
131 Lacation {
132 lat: String,
134 lon: String,
136 title: Option<String>,
138 content: Option<String>,
140 },
141
142 #[serde(rename = "music")]
144 Music {
145 #[serde(rename = "type")]
147 type_: String,
148 id: Option<String>,
150 url: Option<String>,
152 audio: Option<String>,
154 title: Option<String>,
156 content: Option<String>,
158 image: Option<String>,
160 },
161
162 #[serde(rename = "reply")]
164 Reply {
165 id: String,
167 },
168
169 #[serde(rename = "forward")]
171 Forward {
172 id: String,
174 },
175
176 #[serde(rename = "node")]
178 Node {
179 id: Option<String>,
181 user_id: Option<String>,
183 nickname: Option<String>,
185 content: Option<Vec<Message>>,
187 },
188
189 #[serde(rename = "xml")]
191 Xml {
192 data: String,
194 },
195
196 #[serde(rename = "json")]
198 Json {
199 data: String,
201 },
202}
203
204macro_rules! message_builder {
205 ($fn_name: ident, $message_type: tt) => {
206 pub fn $fn_name() -> Message {
207 Message::$message_type
208 }
209 };
210 ($fn_name: ident, $message_type: tt, $param: ident: $param_ty: ty) => {
211 pub fn $fn_name($param: $param_ty) -> Message {
212 Message::$message_type { $param: $param }
213 }
214 };
215 ($fn_name: ident, $message_type: tt, $($param: ident: $param_ty: ty),*) => {
216 pub fn $fn_name($($param: $param_ty,)*) -> Message {
217 Message::$message_type { $($param: $param,)* }
218 }
219 };
220}
221
222impl Message {
223 message_builder!(text, Text, text: String);
229 message_builder!(face, Face, id: String);
230 message_builder!(
231 image,
232 Image,
233 file: String,
234 type_: Option<String>,
235 url: Option<String>,
236 cache: Option<u8>,
237 proxy: Option<u8>,
238 timeout: Option<i64>
239 );
240 message_builder!(
241 record,
242 Record,
243 file: String,
244 magic: Option<u8>,
245 url: Option<String>,
246 cache: Option<u8>,
247 proxy: Option<u8>,
248 timeout: Option<i64>
249 );
250 message_builder!(
251 video,
252 Video,
253 file: String,
254 url: Option<String>,
255 cache: Option<u8>,
256 proxy: Option<u8>,
257 timeout: Option<i64>
258 );
259 message_builder!(at, At, qq: String);
260 message_builder!(rps, Rps);
261 message_builder!(dice, Dice);
262 message_builder!(shake, Shake);
263 message_builder!(poke, Poke, type_: String, id: String, name: Option<String>);
264 message_builder!(anonymous, Anonymous);
265 message_builder!(
266 share,
267 Share,
268 url: String,
269 title: String,
270 content: Option<String>,
271 image: Option<String>
272 );
273 message_builder!(contact, Contact, type_: String, id: String);
274 message_builder!(
275 location,
276 Lacation,
277 lat: String,
278 lon: String,
279 title: Option<String>,
280 content: Option<String>
281 );
282 message_builder!(
283 music,
284 Music,
285 type_: String,
286 id: Option<String>,
287 url: Option<String>,
288 audio: Option<String>,
289 title: Option<String>,
290 content: Option<String>,
291 image: Option<String>
292 );
293 message_builder!(reply, Reply, id: String);
294 message_builder!(forward, Forward, id: String);
295 message_builder!(
296 node,
297 Node,
298 id: Option<String>,
299 user_id: Option<String>,
300 nickname: Option<String>,
301 content: Option<Vec<Message>>
302 );
303 message_builder!(xml, Xml, data: String);
304 message_builder!(json, Json, data: String);
305}