use super::{CmdError, Error, QueryResponse};
use sn_data_types::{
Map, MapAddress as Address, MapEntryActions as Changes, MapPermissionSet as PermissionSet,
PublicKey,
};
use xor_name::XorName;
use serde::{Deserialize, Serialize};
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, Debug)]
pub enum MapRead {
Get(Address),
GetValue {
address: Address,
#[serde(with = "serde_bytes")]
key: Vec<u8>,
},
GetShell(Address),
GetVersion(Address),
ListEntries(Address),
ListKeys(Address),
ListValues(Address),
ListPermissions(Address),
ListUserPermissions {
address: Address,
user: PublicKey,
},
}
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, PartialOrd, Clone, Serialize, Deserialize, Debug)]
pub enum MapWrite {
New(Map),
Delete(Address),
Edit {
address: Address,
changes: Changes,
},
DelUserPermissions {
address: Address,
user: PublicKey,
version: u64,
},
SetUserPermissions {
address: Address,
user: PublicKey,
permissions: PermissionSet,
version: u64,
},
}
impl MapRead {
pub fn error(&self, error: Error) -> QueryResponse {
use MapRead::*;
match *self {
Get(_) => QueryResponse::GetMap(Err(error)),
GetValue { .. } => QueryResponse::GetMapValue(Err(error)),
GetShell(_) => QueryResponse::GetMapShell(Err(error)),
GetVersion(_) => QueryResponse::GetMapVersion(Err(error)),
ListEntries(_) => QueryResponse::ListMapEntries(Err(error)),
ListKeys(_) => QueryResponse::ListMapKeys(Err(error)),
ListValues(_) => QueryResponse::ListMapValues(Err(error)),
ListPermissions(_) => QueryResponse::ListMapPermissions(Err(error)),
ListUserPermissions { .. } => QueryResponse::ListMapUserPermissions(Err(error)),
}
}
pub fn dst_address(&self) -> XorName {
use MapRead::*;
match self {
Get(ref address)
| GetValue { ref address, .. }
| GetShell(ref address)
| GetVersion(ref address)
| ListEntries(ref address)
| ListKeys(ref address)
| ListValues(ref address)
| ListPermissions(ref address)
| ListUserPermissions { ref address, .. } => *address.name(),
}
}
}
impl MapWrite {
pub fn error(&self, error: Error) -> CmdError {
CmdError::Data(error)
}
pub fn dst_address(&self) -> XorName {
use MapWrite::*;
match self {
New(ref data) => *data.name(),
Delete(ref address)
| SetUserPermissions { ref address, .. }
| DelUserPermissions { ref address, .. }
| Edit { ref address, .. } => *address.name(),
}
}
pub fn owner(&self) -> Option<PublicKey> {
match self {
Self::New(data) => Some(data.owner()),
_ => None,
}
}
}