use std::fmt;
use display_more::DisplayOptionExt;
use display_more::DisplayResultExt;
use crate::RaftTypeConfig;
use crate::type_config::alias::LogIdOf;
#[derive(Debug, Clone)]
pub(crate) struct Progress<C>
where C: RaftTypeConfig
{
pub(crate) target: C::NodeId,
pub(crate) result: Result<ReplicationResult<C>, String>,
}
impl<C> fmt::Display for Progress<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"replication::Progress: target={}, result: {}",
self.target,
self.result.display(),
)
}
}
#[derive(Clone, Debug)]
pub(crate) struct ReplicationResult<C: RaftTypeConfig>(pub(crate) Result<Option<LogIdOf<C>>, LogIdOf<C>>);
impl<C> fmt::Display for ReplicationResult<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.0 {
Ok(matching) => write!(f, "(Match:{})", matching.display()),
Err(conflict) => write!(f, "(Conflict:{})", conflict),
}
}
}
#[cfg(test)]
mod tests {
use crate::engine::testing::UTConfig;
use crate::engine::testing::log_id;
use crate::replication::response::ReplicationResult;
#[test]
fn test_replication_result_display() {
let result = ReplicationResult::<UTConfig>(Ok(Some(log_id(1, 2, 3))));
let want = format!("(Match:{})", log_id(1, 2, 3));
assert!(result.to_string().ends_with(&want), "{}", result.to_string());
let result = ReplicationResult::<UTConfig>(Err(log_id(1, 2, 3)));
let want = format!("(Conflict:{})", log_id(1, 2, 3));
assert!(result.to_string().ends_with(&want), "{}", result.to_string());
}
}