use super::{CmdError, Error, QueryResponse, Result};
use crate::messaging::data::OperationId;
use crate::types::{
register::{Entry, Register, RegisterOp, User},
PublicKey, RegisterAddress as Address,
};
use serde::{Deserialize, Serialize};
use xor_name::XorName;
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, Debug)]
pub enum RegisterRead {
Get(Address),
Read(Address),
GetPolicy(Address),
GetUserPermissions {
address: Address,
user: User,
},
GetOwner(Address),
}
#[derive(Eq, PartialEq, Clone, Serialize, Deserialize, Debug)]
pub struct RegisterCmd {
pub write: RegisterWrite,
pub auth: crate::messaging::ServiceAuth,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub enum RegisterWrite {
New(Register),
Edit(RegisterOp<Entry>),
Delete(Address),
}
impl RegisterRead {
pub fn error(&self, error: Error) -> Result<QueryResponse> {
match *self {
RegisterRead::Get(_) => Ok(QueryResponse::GetRegister((
Err(error),
self.operation_id()?,
))),
RegisterRead::Read(_) => Ok(QueryResponse::ReadRegister((
Err(error),
self.operation_id()?,
))),
RegisterRead::GetPolicy(_) => Ok(QueryResponse::GetRegisterPolicy((
Err(error),
self.operation_id()?,
))),
RegisterRead::GetUserPermissions { .. } => Ok(
QueryResponse::GetRegisterUserPermissions((Err(error), self.operation_id()?)),
),
RegisterRead::GetOwner(_) => Ok(QueryResponse::GetRegisterOwner((
Err(error),
self.operation_id()?,
))),
}
}
pub fn dst_address(&self) -> Address {
match self {
RegisterRead::Get(ref address)
| RegisterRead::Read(ref address)
| RegisterRead::GetPolicy(ref address)
| RegisterRead::GetUserPermissions { ref address, .. }
| RegisterRead::GetOwner(ref address) => *address,
}
}
pub fn dst_name(&self) -> XorName {
match self {
RegisterRead::Get(ref address)
| RegisterRead::Read(ref address)
| RegisterRead::GetPolicy(ref address)
| RegisterRead::GetUserPermissions { ref address, .. }
| RegisterRead::GetOwner(ref address) => *address.name(),
}
}
pub fn operation_id(&self) -> Result<OperationId> {
match self {
RegisterRead::Get(ref address) => Ok(format!(
"Get-{:?}",
address
.encode_to_zbase32()
.map_err(|_| Error::NoOperationId)?
)),
RegisterRead::Read(ref address) => Ok(format!(
"Read-{:?}",
address
.encode_to_zbase32()
.map_err(|_| Error::NoOperationId)?
)),
RegisterRead::GetPolicy(ref address) => Ok(format!(
"GetPolicy-{:?}",
address
.encode_to_zbase32()
.map_err(|_| Error::NoOperationId)?
)),
RegisterRead::GetUserPermissions { ref address, .. } => Ok(format!(
"GetUserPermissions-{:?}",
address
.encode_to_zbase32()
.map_err(|_| Error::NoOperationId)?
)),
RegisterRead::GetOwner(ref address) => Ok(format!(
"GetOwner-{:?}",
address
.encode_to_zbase32()
.map_err(|_| Error::NoOperationId)?
)),
}
}
}
impl RegisterWrite {
pub fn error(&self, error: Error) -> CmdError {
CmdError::Data(error)
}
pub fn dst_name(&self) -> XorName {
match self {
RegisterWrite::New(ref data) => *data.name(),
RegisterWrite::Delete(ref address) => *address.name(),
RegisterWrite::Edit(ref op) => *op.address.name(),
}
}
pub fn address(&self) -> &Address {
match self {
Self::New(map) => map.address(),
Self::Delete(address) => address,
Self::Edit(ref op) => &op.address,
}
}
pub fn owner(&self) -> Option<PublicKey> {
match self {
Self::New(data) => Some(data.owner()),
_ => None,
}
}
}