cufflink_types/
delivery.rs1use serde::{Deserialize, Serialize};
5
6pub const DELIVERY_KEY: &str = "__delivery";
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(untagged, deny_unknown_fields)]
11pub enum DeliveryControl {
12 RetryAfter { retry_after_ms: u64 },
14 Terminal { terminal: String },
16}
17
18#[cfg(test)]
19mod tests {
20 use super::*;
21 use serde_json::json;
22
23 #[test]
24 fn the_wire_shapes_are_pinned() {
25 for (control, wire) in [
26 (
27 DeliveryControl::RetryAfter {
28 retry_after_ms: 1500,
29 },
30 json!({"retry_after_ms": 1500}),
31 ),
32 (
33 DeliveryControl::Terminal {
34 terminal: "unknown book".into(),
35 },
36 json!({"terminal": "unknown book"}),
37 ),
38 ] {
39 assert_eq!(serde_json::to_value(&control).expect("serialize"), wire);
40 assert_eq!(
41 serde_json::from_value::<DeliveryControl>(wire).expect("deserialize"),
42 control
43 );
44 }
45 }
46
47 #[test]
48 fn anything_else_is_refused() {
49 for wire in [
50 json!({}),
51 json!({"retry_after_ms": -1}),
52 json!({"retry_after_ms": "soon"}),
53 json!({"terminal": 7}),
54 json!({"retry_after_ms": 1, "terminal": "both"}),
55 json!({"retry_after_ms": 1, "extra": true}),
56 json!("terminal"),
57 ] {
58 assert!(
59 serde_json::from_value::<DeliveryControl>(wire.clone()).is_err(),
60 "{wire}"
61 );
62 }
63 }
64}