use super::{AuthorisationKind, Type};
use crate::{
Error, MData, MDataAddress, MDataEntryActions, MDataPermissionSet, PublicKey, Response, XorName,
};
use serde::{Deserialize, Serialize};
use std::{borrow::Cow, fmt};
#[allow(clippy::large_enum_variant)]
#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
pub enum MDataRequest {
Put(MData),
Get(MDataAddress),
GetValue {
address: MDataAddress,
key: Vec<u8>,
},
Delete(MDataAddress),
GetShell(MDataAddress),
GetVersion(MDataAddress),
ListEntries(MDataAddress),
ListKeys(MDataAddress),
ListValues(MDataAddress),
SetUserPermissions {
address: MDataAddress,
user: PublicKey,
permissions: MDataPermissionSet,
version: u64,
},
DelUserPermissions {
address: MDataAddress,
user: PublicKey,
version: u64,
},
ListPermissions(MDataAddress),
ListUserPermissions {
address: MDataAddress,
user: PublicKey,
},
MutateEntries {
address: MDataAddress,
actions: MDataEntryActions,
},
}
impl MDataRequest {
pub fn get_type(&self) -> Type {
use MDataRequest::*;
match *self {
Get(_)
| GetValue { .. }
| GetShell(_)
| GetVersion(_)
| ListEntries(_)
| ListKeys(_)
| ListValues(_)
| ListPermissions(_)
| ListUserPermissions { .. } => Type::PrivateGet,
Put(_)
| Delete(_)
| SetUserPermissions { .. }
| DelUserPermissions { .. }
| MutateEntries { .. } => Type::Mutation,
}
}
pub fn error_response(&self, error: Error) -> Response {
use MDataRequest::*;
match *self {
Get(_) => Response::GetMData(Err(error)),
GetValue { .. } => Response::GetMDataValue(Err(error)),
GetShell(_) => Response::GetMDataShell(Err(error)),
GetVersion(_) => Response::GetMDataVersion(Err(error)),
ListEntries(_) => Response::ListMDataEntries(Err(error)),
ListKeys(_) => Response::ListMDataKeys(Err(error)),
ListValues(_) => Response::ListMDataValues(Err(error)),
ListPermissions(_) => Response::ListMDataPermissions(Err(error)),
ListUserPermissions { .. } => Response::ListMDataUserPermissions(Err(error)),
Put(_)
| Delete(_)
| SetUserPermissions { .. }
| DelUserPermissions { .. }
| MutateEntries { .. } => Response::Mutation(Err(error)),
}
}
pub fn authorisation_kind(&self) -> AuthorisationKind {
use MDataRequest::*;
match *self {
Put(_)
| Delete(_)
| SetUserPermissions { .. }
| DelUserPermissions { .. }
| MutateEntries { .. } => AuthorisationKind::Mutation,
Get(_)
| GetValue { .. }
| GetShell(_)
| GetVersion(_)
| ListEntries(_)
| ListKeys(_)
| ListValues(_)
| ListPermissions(_)
| ListUserPermissions { .. } => AuthorisationKind::GetPriv,
}
}
pub fn dest_address(&self) -> Option<Cow<XorName>> {
use MDataRequest::*;
match self {
Put(ref data) => Some(Cow::Borrowed(data.name())),
Get(ref address)
| GetValue { ref address, .. }
| Delete(ref address)
| GetShell(ref address)
| GetVersion(ref address)
| ListEntries(ref address)
| ListKeys(ref address)
| ListValues(ref address)
| SetUserPermissions { ref address, .. }
| DelUserPermissions { ref address, .. }
| ListPermissions(ref address)
| ListUserPermissions { ref address, .. }
| MutateEntries { ref address, .. } => Some(Cow::Borrowed(address.name())),
}
}
}
impl fmt::Debug for MDataRequest {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
use MDataRequest::*;
write!(
formatter,
"Request::{}",
match *self {
Put(_) => "PutMData",
Get(_) => "GetMData",
GetValue { .. } => "GetMDataValue",
Delete(_) => "DeleteMData",
GetShell(_) => "GetMDataShell",
GetVersion(_) => "GetMDataVersion",
ListEntries(_) => "ListMDataEntries",
ListKeys(_) => "ListMDataKeys",
ListValues(_) => "ListMDataValues",
SetUserPermissions { .. } => "SetMDataUserPermissions",
DelUserPermissions { .. } => "DelMDataUserPermissions",
ListPermissions(_) => "ListMDataPermissions",
ListUserPermissions { .. } => "ListMDataUserPermissions",
MutateEntries { .. } => "MutateMDataEntries",
}
)
}
}