Skip to main content

cufflink_types/
delivery.rs

1//! The `__delivery` block of a v2 guest response: how the platform should
2//! settle the message or job the guest just handled.
3
4use serde::{Deserialize, Serialize};
5
6/// The key of the block in a v2 response envelope.
7pub const DELIVERY_KEY: &str = "__delivery";
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(untagged, deny_unknown_fields)]
11pub enum DeliveryControl {
12    /// Deliver again after this long.
13    RetryAfter { retry_after_ms: u64 },
14    /// Never deliver again; `terminal` says why.
15    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}