use serde::{Deserialize, Serialize};
use crate::receiver::{Reject, Status};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplicaInfo {
pub name: String,
pub generation: u64,
pub frames: u32,
pub pending: bool,
pub bytes: u64,
}
impl ReplicaInfo {
pub fn new(name: impl Into<String>, status: Status) -> Self {
Self {
name: name.into(),
generation: status.generation,
frames: status.frames,
pending: status.pending,
bytes: status.bytes,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplicaList {
pub replicas: Vec<ReplicaInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Deleted {
pub deleted: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Refusal {
pub error: String,
#[serde(default)]
pub needs_base: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub generation: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frames: Option<u32>,
}
impl Refusal {
pub fn new(error: impl Into<String>) -> Self {
Self {
error: error.into(),
needs_base: false,
generation: None,
frames: None,
}
}
}
impl From<&Reject> for Refusal {
fn from(reject: &Reject) -> Self {
let mut refusal = Self::new(reject.to_string());
match *reject {
Reject::NeedsBase(_) => refusal.needs_base = true,
Reject::Mismatch { generation, frames } => {
refusal.generation = Some(generation);
refusal.frames = Some(frames);
}
Reject::Busy | Reject::Bad(_) => {}
}
refusal
}
}