use super::{AuthorisationKind, CmdError, DataAuthKind, QueryResponse};
use crate::{
Error, PublicKey, Sequence, SequenceAddress as Address, SequenceEntry as Entry,
SequenceIndex as Index, SequencePrivatePermissions as PrivatePermissions,
SequencePublicPermissions as PublicPermissions, SequenceUser as User,
SequenceWriteOp as WriteOp, XorName,
};
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize)]
pub enum SequenceRead {
Get(Address),
GetRange {
address: Address,
range: (Index, Index),
},
GetLastEntry(Address),
GetPermissions(Address),
GetUserPermissions {
address: Address,
user: User,
},
GetOwner(Address),
}
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize)]
pub enum SequenceWrite {
New(Sequence),
Edit(WriteOp<Entry>),
Delete(Address),
SetOwner(WriteOp<PublicKey>),
SetPublicPermissions(WriteOp<PublicPermissions>),
SetPrivatePermissions(WriteOp<PrivatePermissions>),
}
impl SequenceRead {
pub fn error(&self, error: Error) -> QueryResponse {
use SequenceRead::*;
match *self {
Get(_) => QueryResponse::GetSequence(Err(error)),
GetRange { .. } => QueryResponse::GetSequenceRange(Err(error)),
GetLastEntry(_) => QueryResponse::GetSequenceLastEntry(Err(error)),
GetPermissions(_) => QueryResponse::GetSequencePermissions(Err(error)),
GetUserPermissions { .. } => QueryResponse::GetSequencePermissions(Err(error)),
GetOwner(_) => QueryResponse::GetSequenceOwner(Err(error)),
}
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
use SequenceRead::*;
match *self {
Get(address)
| GetRange { address, .. }
| GetLastEntry(address)
| GetPermissions(address)
| GetUserPermissions { address, .. }
| GetOwner(address) => {
if address.is_pub() {
AuthorisationKind::Data(DataAuthKind::PublicRead)
} else {
AuthorisationKind::Data(DataAuthKind::PrivateRead)
}
}
}
}
pub fn dst_address(&self) -> XorName {
use SequenceRead::*;
match self {
Get(ref address)
| GetRange { ref address, .. }
| GetLastEntry(ref address)
| GetPermissions(ref address)
| GetUserPermissions { ref address, .. }
| GetOwner(ref address) => *address.name(),
}
}
}
impl fmt::Debug for SequenceRead {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use SequenceRead::*;
write!(
formatter,
"Request::{}",
match *self {
Get(_) => "GetSequence",
GetRange { .. } => "GetSequenceRange",
GetLastEntry(_) => "GetSequenceLastEntry",
GetPermissions { .. } => "GetSequencePermissions",
GetUserPermissions { .. } => "GetUserPermissions",
GetOwner { .. } => "GetOwner",
}
)
}
}
impl SequenceWrite {
pub fn error(&self, error: Error) -> CmdError {
CmdError::Data(error)
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
AuthorisationKind::Data(DataAuthKind::Write)
}
pub fn dst_address(&self) -> XorName {
use SequenceWrite::*;
match self {
New(ref data) => *data.name(),
Delete(ref address) => *address.name(),
SetPublicPermissions(ref op) => *op.address.name(),
SetPrivatePermissions(ref op) => *op.address.name(),
SetOwner(ref op) => *op.address.name(),
Edit(ref op) => *op.address.name(),
}
}
}
impl fmt::Debug for SequenceWrite {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use SequenceWrite::*;
write!(
formatter,
"Request::{}",
match *self {
New(_) => "NewSequence",
Delete(_) => "DeleteSequence",
SetPublicPermissions(_) => "SetPublicPermissions",
SetPrivatePermissions(_) => "SetPrivatePermissions",
SetOwner(_) => "SetOwner",
Edit(_) => "EditSequence",
}
)
}
}