use std::{
borrow::Cow,
fmt::{Debug, Display},
};
use casper_types::EraId;
use datasize::DataSize;
use futures::Future;
use serde::Serialize;
use super::Responder;
use crate::components::consensus::EraDump;
#[derive(DataSize, Serialize)]
pub(crate) struct DumpConsensusStateRequest {
pub(crate) era_id: Option<EraId>,
#[data_size(skip)]
#[serde(skip)]
pub(crate) serialize: fn(&EraDump) -> Result<Vec<u8>, Cow<'static, str>>,
pub(crate) responder: Responder<Result<Vec<u8>, Cow<'static, str>>>,
}
impl DumpConsensusStateRequest {
pub(crate) fn answer(
self,
value: Result<&EraDump, Cow<'static, str>>,
) -> impl Future<Output = ()> {
let answer = match value {
Ok(data) => (self.serialize)(data),
Err(err) => Err(err),
};
self.responder.respond(answer)
}
}
impl Display for DumpConsensusStateRequest {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "dump consensus state for ")?;
if let Some(ref era_id) = self.era_id {
Display::fmt(era_id, f)
} else {
f.write_str(" latest era")
}
}
}
impl Debug for DumpConsensusStateRequest {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("DumpConsensusStateRequest")
.field("era_id", &self.era_id)
.finish_non_exhaustive()
}
}