use openraft_macros::since;
use crate::log_id::LogId;
use crate::vote::RaftCommittedLeaderId;
#[since(version = "0.10.0", change = "removed `snapshot_id`")]
#[since(
version = "0.10.0",
change = "from `SnapshotSignature<C>` to `SnapshotSignature<CLID>`"
)]
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize),
serde(bound = "", from = "SnapshotSignatureWire<CLID>")
)]
pub struct SnapshotSignature<CLID>
where CLID: RaftCommittedLeaderId
{
pub last_log_id: Option<LogId<CLID>>,
pub last_membership_log_id: Option<Box<LogId<CLID>>>,
}
#[cfg(feature = "serde")]
#[derive(serde::Deserialize)]
#[serde(bound = "")]
struct SnapshotSignatureWire<CLID>
where CLID: RaftCommittedLeaderId
{
last_log_id: Option<LogId<CLID>>,
last_membership_log_id: Option<Box<LogId<CLID>>>,
#[serde(default)]
#[allow(dead_code)]
snapshot_id: crate::SnapshotId,
}
#[cfg(feature = "serde")]
impl<CLID> From<SnapshotSignatureWire<CLID>> for SnapshotSignature<CLID>
where CLID: RaftCommittedLeaderId
{
fn from(wire: SnapshotSignatureWire<CLID>) -> Self {
SnapshotSignature {
last_log_id: wire.last_log_id,
last_membership_log_id: wire.last_membership_log_id,
}
}
}
#[cfg(feature = "serde")]
impl<CLID> serde::Serialize for SnapshotSignature<CLID>
where CLID: RaftCommittedLeaderId
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: serde::Serializer {
use serde::ser::SerializeStruct;
let mut s = serializer.serialize_struct("SnapshotSignature", 3)?;
s.serialize_field("last_log_id", &self.last_log_id)?;
s.serialize_field("last_membership_log_id", &self.last_membership_log_id)?;
s.serialize_field("snapshot_id", "")?;
s.end()
}
}
#[cfg(test)]
mod tests {
#[cfg(feature = "serde")]
#[test]
fn test_snapshot_signature_serde() {
use super::SnapshotSignature;
use crate::engine::testing::UtClid;
use crate::engine::testing::log_id;
let sig = SnapshotSignature::<UtClid> {
last_log_id: Some(log_id(1, 2, 3)),
last_membership_log_id: Some(Box::new(log_id(4, 5, 6))),
};
let want = r#"{"last_log_id":{"leader_id":{"term":1,"node_id":2},"index":3},"last_membership_log_id":{"leader_id":{"term":4,"node_id":5},"index":6},"snapshot_id":""}"#;
assert_eq!(want, serde_json::to_string(&sig).unwrap());
assert_eq!(sig, serde_json::from_str::<SnapshotSignature<UtClid>>(want).unwrap());
let v09 = r#"{"last_log_id":{"leader_id":{"term":1,"node_id":2},"index":3},"last_membership_log_id":{"leader_id":{"term":4,"node_id":5},"index":6},"snapshot_id":"1-2-3-4"}"#;
assert_eq!(sig, serde_json::from_str::<SnapshotSignature<UtClid>>(v09).unwrap());
}
}