use std::fmt;
use std::fmt::Debug;
use display_more::DisplayOptionExt;
use openraft_macros::since;
use crate::Membership;
use crate::RaftTypeConfig;
use crate::errors::ClientWriteError;
use crate::type_config::alias::LogIdOf;
pub type ClientWriteResult<C> = Result<ClientWriteResponse<C>, ClientWriteError<C>>;
#[cfg_attr(
feature = "serde",
derive(serde::Deserialize, serde::Serialize),
serde(bound = "C::R: crate::AppDataResponse")
)]
pub struct ClientWriteResponse<C: RaftTypeConfig> {
pub log_id: LogIdOf<C>,
pub data: C::R,
pub membership: Option<Membership<C::NodeId, C::Node>>,
}
impl<C> ClientWriteResponse<C>
where C: RaftTypeConfig
{
#[allow(dead_code)]
#[since(version = "0.9.5")]
pub(crate) fn new_app_response(log_id: LogIdOf<C>, data: C::R) -> Self {
Self {
log_id,
data,
membership: None,
}
}
#[since(version = "0.9.5")]
pub fn log_id(&self) -> &LogIdOf<C> {
&self.log_id
}
#[since(version = "0.9.5")]
pub fn response(&self) -> &C::R {
&self.data
}
#[since(version = "0.9.5")]
pub fn membership(&self) -> &Option<Membership<C::NodeId, C::Node>> {
&self.membership
}
}
impl<C: RaftTypeConfig> Debug for ClientWriteResponse<C>
where C::R: Debug
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ClientWriteResponse")
.field("log_id", &self.log_id)
.field("data", &self.data)
.field("membership", &self.membership)
.finish()
}
}
impl<C> fmt::Display for ClientWriteResponse<C>
where C: RaftTypeConfig
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"ClientWriteResponse{{log_id:{}, membership:{}}}",
self.log_id,
self.membership.display()
)
}
}