1use serde::{Deserialize, Serialize};
20
21use crate::sync::wire::ack_status::AckStatus;
22
23#[derive(
25 Debug,
26 Clone,
27 PartialEq,
28 Eq,
29 Serialize,
30 Deserialize,
31 zerompk::ToMessagePack,
32 zerompk::FromMessagePack,
33)]
34pub enum KvPushOp {
35 Put {
37 row: Vec<u8>,
39 expire_at_ms: u64,
42 },
43 Delete,
45}
46
47#[derive(
49 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
50)]
51pub struct KvPushMsg {
52 pub lite_id: String,
54 pub collection: String,
56 pub key: Vec<u8>,
58 pub op: KvPushOp,
60 pub batch_id: u64,
62 pub producer_id: u64,
64 pub epoch: u64,
66 pub seq: u64,
68}
69
70#[derive(
72 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
73)]
74pub struct KvPushAckMsg {
75 pub collection: String,
77 pub key: Vec<u8>,
79 pub batch_id: u64,
81 pub accepted: bool,
83 pub reject_reason: Option<String>,
85 pub applied_seq: u64,
87 pub status: AckStatus,
89}
90
91#[derive(
93 Debug,
94 Clone,
95 PartialEq,
96 Eq,
97 Serialize,
98 Deserialize,
99 zerompk::ToMessagePack,
100 zerompk::FromMessagePack,
101)]
102pub enum RowPushRefusal {
103 Malformed { detail: String },
105 ApplyFailed { detail: String },
107}
108
109impl std::fmt::Display for RowPushRefusal {
110 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
111 match self {
112 Self::Malformed { detail } => write!(f, "malformed row push: {detail}"),
113 Self::ApplyFailed { detail } => write!(f, "row push apply failed: {detail}"),
114 }
115 }
116}
117
118#[derive(
120 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
121)]
122pub struct RowPushRejectMsg {
123 pub collection: String,
125 pub document_id: String,
127 pub sequence: u64,
129 pub peer_id: u64,
131 pub refusal: RowPushRefusal,
133}
134
135#[cfg(test)]
136mod tests {
137 use super::*;
138
139 #[test]
140 fn a_put_push_round_trips() {
141 let msg = KvPushMsg {
142 lite_id: "lite-1".into(),
143 collection: "cfg".into(),
144 key: b"k1".to_vec(),
145 op: KvPushOp::Put {
146 row: vec![0x81, 0xa1, b'k', 0x01],
147 expire_at_ms: 42,
148 },
149 batch_id: 7,
150 producer_id: 3,
151 epoch: 1,
152 seq: 9,
153 };
154 let bytes = zerompk::to_msgpack_vec(&msg).expect("encode");
155 let back: KvPushMsg = zerompk::from_msgpack(&bytes).expect("decode");
156 assert_eq!(back.op, msg.op);
157 assert_eq!(back.key, msg.key);
158 assert_eq!(back.seq, 9);
159 }
160
161 #[test]
162 fn a_row_push_reject_round_trips() {
163 let msg = RowPushRejectMsg {
164 collection: "cfg".into(),
165 document_id: "k1".into(),
166 sequence: 4,
167 peer_id: 2,
168 refusal: RowPushRefusal::Malformed {
169 detail: "not a row map".into(),
170 },
171 };
172 let bytes = zerompk::to_msgpack_vec(&msg).expect("encode");
173 let back: RowPushRejectMsg = zerompk::from_msgpack(&bytes).expect("decode");
174 assert_eq!(back.refusal, msg.refusal);
175 assert_eq!(back.sequence, 4);
176 }
177}