use super::{AuthorisationKind, Type};
use crate::{
Error, Response, SData, SDataAddress, SDataEntry, SDataIndex, SDataMutationOperation,
SDataOwner, SDataPrivPermissions, SDataPubPermissions, SDataUser, XorName,
};
use serde::{Deserialize, Serialize};
use std::{borrow::Cow, fmt};
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize)]
pub enum SDataRequest {
Store(SData),
Get(SDataAddress),
Delete(SDataAddress),
GetRange {
address: SDataAddress,
range: (SDataIndex, SDataIndex),
},
GetLastEntry(SDataAddress),
GetPermissions(SDataAddress),
GetUserPermissions {
address: SDataAddress,
user: SDataUser,
},
GetOwner(SDataAddress),
MutatePubPermissions(SDataMutationOperation<SDataPubPermissions>),
MutatePrivPermissions(SDataMutationOperation<SDataPrivPermissions>),
MutateOwner(SDataMutationOperation<SDataOwner>),
Mutate(SDataMutationOperation<SDataEntry>),
}
impl SDataRequest {
pub fn get_type(&self) -> Type {
use SDataRequest::*;
match *self {
Get(address)
| GetRange { address, .. }
| GetLastEntry(address)
| GetPermissions(address)
| GetUserPermissions { address, .. }
| GetOwner(address) => {
if address.is_pub() {
Type::PublicGet
} else {
Type::PrivateGet
}
}
Store(_)
| Delete(_)
| MutatePubPermissions(_)
| MutatePrivPermissions(_)
| MutateOwner(_)
| Mutate(_) => Type::Mutation,
}
}
pub fn error_response(&self, error: Error) -> Response {
use SDataRequest::*;
match *self {
Get(_) => Response::GetSData(Err(error)),
GetRange { .. } => Response::GetSDataRange(Err(error)),
GetLastEntry(_) => Response::GetSDataLastEntry(Err(error)),
GetPermissions(_) => Response::GetSDataPermissions(Err(error)),
GetUserPermissions { .. } => Response::GetSDataUserPermissions(Err(error)),
GetOwner(_) => Response::GetSDataOwner(Err(error)),
Store(_)
| Delete(_)
| MutatePubPermissions(_)
| MutatePrivPermissions(_)
| MutateOwner(_)
| Mutate(_) => Response::Mutation(Err(error)),
}
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
use SDataRequest::*;
match *self {
Store(_)
| Delete(_)
| MutatePubPermissions(_)
| MutatePrivPermissions(_)
| MutateOwner(_)
| Mutate(_) => AuthorisationKind::Mutation,
Get(address)
| GetRange { address, .. }
| GetLastEntry(address)
| GetPermissions(address)
| GetUserPermissions { address, .. }
| GetOwner(address) => {
if address.is_pub() {
AuthorisationKind::GetPub
} else {
AuthorisationKind::GetPriv
}
}
}
}
pub fn dest_address(&self) -> Option<Cow<XorName>> {
use SDataRequest::*;
match self {
Store(ref data) => Some(Cow::Borrowed(data.name())),
Get(ref address)
| Delete(ref address)
| GetRange { ref address, .. }
| GetLastEntry(ref address) => Some(Cow::Borrowed(address.name())),
GetPermissions(ref address)
| GetUserPermissions { ref address, .. }
| GetOwner(ref address) => Some(Cow::Borrowed(address.name())),
MutatePubPermissions(ref op) => Some(Cow::Borrowed(op.address.name())),
MutatePrivPermissions(ref op) => Some(Cow::Borrowed(op.address.name())),
MutateOwner(ref op) => Some(Cow::Borrowed(op.address.name())),
Mutate(ref op) => Some(Cow::Borrowed(op.address.name())),
}
}
}
impl fmt::Debug for SDataRequest {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use SDataRequest::*;
write!(
formatter,
"Request::{}",
match *self {
Store(_) => "StoreSData",
Get(_) => "GetSData",
Delete(_) => "DeleteSData",
GetRange { .. } => "GetSDataRange",
GetLastEntry(_) => "GetSDataLastEntry",
GetPermissions { .. } => "GetSDataPermissions",
GetUserPermissions { .. } => "GetSDataUserPermissions",
GetOwner { .. } => "GetSDataOwner",
MutatePubPermissions(_) => "MutateSDataPubPermissions",
MutatePrivPermissions(_) => "MutateSDataPrivPermissions",
MutateOwner(_) => "MutateSDataOwner",
Mutate(_) => "MutateSData",
}
)
}
}