use super::{CmdResponse, Error, QueryResponse};
use crate::messaging::{ClientAuth, SectionSig};
#[allow(unused_imports)] use crate::types::register::Register;
use crate::types::{
register::{Entry, EntryHash, Policy, RegisterOp, User},
RegisterAddress,
};
use serde::{Deserialize, Serialize};
use xor_name::XorName;
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, Debug)]
pub enum RegisterQuery {
Get(RegisterAddress),
Read(RegisterAddress),
GetEntry {
address: RegisterAddress,
hash: EntryHash,
},
GetPolicy(RegisterAddress),
GetUserPermissions {
address: RegisterAddress,
user: User,
},
GetOwner(RegisterAddress),
}
#[allow(clippy::large_enum_variant)]
#[derive(Eq, PartialEq, Clone, Serialize, Deserialize, Debug)]
pub enum RegisterCmd {
Create {
cmd: SignedRegisterCreate,
section_sig: SectionSig,
},
Edit(SignedRegisterEdit),
}
impl RegisterCmd {
pub fn to_error_response(&self, error: Error) -> CmdResponse {
match self {
Self::Create { .. } => CmdResponse::CreateRegister(Err(error)),
Self::Edit(_) => CmdResponse::EditRegister(Err(error)),
}
}
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub struct CreateRegister {
pub name: XorName,
pub tag: u64,
pub policy: Policy,
}
impl CreateRegister {
pub fn owner(&self) -> User {
*self.policy.owner()
}
pub fn address(&self) -> RegisterAddress {
RegisterAddress {
name: self.name,
tag: self.tag,
}
}
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub struct EditRegister {
pub address: RegisterAddress,
pub edit: RegisterOp<Entry>,
}
#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
pub struct SignedRegisterCreate {
pub op: CreateRegister,
pub auth: ClientAuth,
}
#[derive(Eq, PartialEq, Clone, Serialize, Deserialize, Debug)]
pub struct SignedRegisterEdit {
pub op: EditRegister,
pub auth: ClientAuth,
}
impl SignedRegisterCreate {
pub fn dst_address(&self) -> RegisterAddress {
self.op.address()
}
}
impl SignedRegisterEdit {
pub fn dst_address(&self) -> RegisterAddress {
self.op.address
}
}
impl RegisterQuery {
pub fn to_error_response(&self, error: Error) -> QueryResponse {
match self {
Self::Get(_) => QueryResponse::GetRegister(Err(error)),
Self::Read(_) => QueryResponse::ReadRegister(Err(error)),
Self::GetPolicy(_) => QueryResponse::GetRegisterPolicy(Err(error)),
Self::GetUserPermissions { .. } => {
QueryResponse::GetRegisterUserPermissions(Err(error))
}
Self::GetEntry { .. } => QueryResponse::GetRegisterEntry(Err(error)),
Self::GetOwner(_) => QueryResponse::GetRegisterOwner(Err(error)),
}
}
pub fn dst_address(&self) -> RegisterAddress {
match self {
Self::Get(ref address)
| Self::Read(ref address)
| Self::GetPolicy(ref address)
| Self::GetUserPermissions { ref address, .. }
| Self::GetEntry { ref address, .. }
| Self::GetOwner(ref address) => *address,
}
}
pub fn dst_name(&self) -> XorName {
match self {
Self::Get(ref address)
| Self::Read(ref address)
| Self::GetPolicy(ref address)
| Self::GetUserPermissions { ref address, .. }
| Self::GetEntry { ref address, .. }
| Self::GetOwner(ref address) => *address.name(),
}
}
}
impl RegisterCmd {
pub fn name(&self) -> XorName {
*self.dst_address().name()
}
pub fn dst_address(&self) -> RegisterAddress {
match self {
Self::Create { cmd, .. } => cmd.dst_address(),
Self::Edit(cmd) => cmd.dst_address(),
}
}
pub fn owner(&self) -> Option<User> {
match self {
Self::Create {
cmd: SignedRegisterCreate { op, .. },
..
} => Some(op.owner()),
_ => None,
}
}
}