use super::{
AuthorisationKind, CmdError, MiscAuthKind, MoneyAuthKind, QueryResponse, TransferError,
};
#[cfg(feature = "simulated-payouts")]
use crate::Transfer;
use crate::{DebitAgreementProof, Error, PublicKey, SignedTransfer, XorName};
use serde::{Deserialize, Serialize};
use std::fmt;
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum TransferCmd {
#[cfg(feature = "simulated-payouts")]
SimulatePayout(Transfer),
ValidateTransfer(SignedTransfer),
RegisterTransfer(DebitAgreementProof),
}
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum TransferQuery {
GetReplicaKeys(PublicKey),
GetBalance(PublicKey),
GetHistory {
at: PublicKey,
since_version: usize,
},
}
impl TransferCmd {
pub fn error(&self, error: Error) -> CmdError {
use CmdError::*;
use TransferCmd::*;
use TransferError::*;
match *self {
ValidateTransfer(_) => Transfer(TransferValidation(error)),
RegisterTransfer(_) => Transfer(TransferRegistration(error)),
#[cfg(feature = "simulated-payouts")]
SimulatePayout(_) => Transfer(TransferRegistration(error)),
}
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
use TransferCmd::*;
match self {
RegisterTransfer(_) => AuthorisationKind::None, ValidateTransfer(_) => AuthorisationKind::Misc(MiscAuthKind::WriteAndTransfer),
#[cfg(feature = "simulated-payouts")]
SimulatePayout(_) => AuthorisationKind::None,
}
}
pub fn dst_address(&self) -> XorName {
use TransferCmd::*;
match self {
RegisterTransfer(ref proof) => XorName::from(proof.from()), ValidateTransfer(ref signed_transfer) => XorName::from(signed_transfer.from()), #[cfg(feature = "simulated-payouts")]
SimulatePayout(ref transfer) => XorName::from(transfer.from()), }
}
}
impl fmt::Debug for TransferCmd {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use TransferCmd::*;
write!(
formatter,
"TransferCmd::{}",
match *self {
RegisterTransfer { .. } => "RegisterTransfer",
ValidateTransfer { .. } => "ValidateTransfer",
#[cfg(feature = "simulated-payouts")]
SimulatePayout { .. } => "SimulatePayout",
}
)
}
}
impl TransferQuery {
pub fn error(&self, error: Error) -> QueryResponse {
use TransferQuery::*;
match *self {
GetReplicaKeys(_) => QueryResponse::GetReplicaKeys(Err(error)),
GetBalance(_) => QueryResponse::GetBalance(Err(error)),
GetHistory { .. } => QueryResponse::GetHistory(Err(error)),
}
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
use TransferQuery::*;
match self {
GetBalance(_) => AuthorisationKind::Money(MoneyAuthKind::ReadBalance), GetReplicaKeys(_) => AuthorisationKind::None, GetHistory { .. } => AuthorisationKind::Money(MoneyAuthKind::ReadHistory), }
}
pub fn dst_address(&self) -> XorName {
use TransferQuery::*;
match self {
GetBalance(at) | GetReplicaKeys(at) | GetHistory { at, .. } => XorName::from(*at),
}
}
}
impl fmt::Debug for TransferQuery {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use TransferQuery::*;
write!(
formatter,
"TransferQuery::{}",
match *self {
GetBalance(_) => "GetBalance",
GetReplicaKeys(_) => "GetReplicaKeys",
GetHistory { .. } => "GetHistory",
}
)
}
}