use serde::{Deserialize, Serialize};
use crate::sync::wire::ack_status::AckStatus;
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum KvPushOp {
Put {
row: Vec<u8>,
expire_at_ms: u64,
},
Delete,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct KvPushMsg {
pub lite_id: String,
pub collection: String,
pub key: Vec<u8>,
pub op: KvPushOp,
pub batch_id: u64,
pub producer_id: u64,
pub epoch: u64,
pub seq: u64,
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct KvPushAckMsg {
pub collection: String,
pub key: Vec<u8>,
pub batch_id: u64,
pub accepted: bool,
pub reject_reason: Option<String>,
pub applied_seq: u64,
pub status: AckStatus,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Serialize,
Deserialize,
zerompk::ToMessagePack,
zerompk::FromMessagePack,
)]
pub enum RowPushRefusal {
Malformed { detail: String },
ApplyFailed { detail: String },
}
impl std::fmt::Display for RowPushRefusal {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Malformed { detail } => write!(f, "malformed row push: {detail}"),
Self::ApplyFailed { detail } => write!(f, "row push apply failed: {detail}"),
}
}
}
#[derive(
Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
)]
pub struct RowPushRejectMsg {
pub collection: String,
pub document_id: String,
pub sequence: u64,
pub peer_id: u64,
pub refusal: RowPushRefusal,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_put_push_round_trips() {
let msg = KvPushMsg {
lite_id: "lite-1".into(),
collection: "cfg".into(),
key: b"k1".to_vec(),
op: KvPushOp::Put {
row: vec![0x81, 0xa1, b'k', 0x01],
expire_at_ms: 42,
},
batch_id: 7,
producer_id: 3,
epoch: 1,
seq: 9,
};
let bytes = zerompk::to_msgpack_vec(&msg).expect("encode");
let back: KvPushMsg = zerompk::from_msgpack(&bytes).expect("decode");
assert_eq!(back.op, msg.op);
assert_eq!(back.key, msg.key);
assert_eq!(back.seq, 9);
}
#[test]
fn a_row_push_reject_round_trips() {
let msg = RowPushRejectMsg {
collection: "cfg".into(),
document_id: "k1".into(),
sequence: 4,
peer_id: 2,
refusal: RowPushRefusal::Malformed {
detail: "not a row map".into(),
},
};
let bytes = zerompk::to_msgpack_vec(&msg).expect("encode");
let back: RowPushRejectMsg = zerompk::from_msgpack(&bytes).expect("decode");
assert_eq!(back.refusal, msg.refusal);
assert_eq!(back.sequence, 4);
}
}