mod cmd;
mod node_id;
mod query;
mod register;
mod response;
pub use self::{
cmd::{Cmd, Hash},
node_id::NodeId,
query::Query,
register::RegisterCmd,
response::{CmdOk, CmdResponse, QueryResponse},
};
use super::NetworkAddress;
use crate::{
error::{Error, Result},
storage::{Chunk, SpendAddress},
};
use serde::{Deserialize, Serialize};
use sn_registers::SignedRegister;
use sn_transfers::SignedSpend;
use xor_name::XorName;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Request {
Cmd(Cmd),
Query(Query),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Response {
Cmd(CmdResponse),
Query(QueryResponse),
}
#[derive(custom_debug::Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum ReplicatedData {
Chunk(Chunk),
Spend(Vec<SignedSpend>),
Register(SignedRegister),
}
impl Request {
pub fn dst(&self) -> NetworkAddress {
match self {
Request::Cmd(cmd) => cmd.dst(),
Request::Query(query) => query.dst(),
}
}
}
impl ReplicatedData {
pub fn name(&self) -> Result<XorName> {
let name = match self {
Self::Chunk(chunk) => *chunk.name(),
Self::Spend(spends) => {
if let Some(spend) = spends.first() {
*SpendAddress::from_unique_pubkey(spend.unique_pubkey()).xorname()
} else {
return Err(Error::SpendIsEmpty);
}
}
Self::Register(register) => register.address().xorname(),
};
Ok(name)
}
pub fn dst(&self) -> Result<NetworkAddress> {
let dst = match self {
Self::Chunk(chunk) => NetworkAddress::from_chunk_address(*chunk.address()),
Self::Spend(spends) => {
if let Some(spend) = spends.first() {
NetworkAddress::from_cash_note_address(SpendAddress::from_unique_pubkey(
spend.unique_pubkey(),
))
} else {
return Err(Error::SpendIsEmpty);
}
}
Self::Register(register) => NetworkAddress::from_register_address(*register.address()),
};
Ok(dst)
}
}
impl std::fmt::Display for Response {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}