surrealdb_sql/
permission.rsuse crate::fmt::is_pretty;
use crate::fmt::pretty_indent;
use crate::fmt::pretty_sequence_item;
use crate::Value;
use revision::revisioned;
use serde::{Deserialize, Serialize};
use std::fmt::Write;
use std::fmt::{self, Display, Formatter};
use std::str;
#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
#[revisioned(revision = 1)]
pub struct Permissions {
pub select: Permission,
pub create: Permission,
pub update: Permission,
pub delete: Permission,
}
impl Permissions {
pub fn none() -> Self {
Permissions {
select: Permission::None,
create: Permission::None,
update: Permission::None,
delete: Permission::None,
}
}
pub fn full() -> Self {
Permissions {
select: Permission::Full,
create: Permission::Full,
update: Permission::Full,
delete: Permission::Full,
}
}
pub fn is_none(&self) -> bool {
self.select == Permission::None
&& self.create == Permission::None
&& self.update == Permission::None
&& self.delete == Permission::None
}
pub fn is_full(&self) -> bool {
self.select == Permission::Full
&& self.create == Permission::Full
&& self.update == Permission::Full
&& self.delete == Permission::Full
}
}
impl Display for Permissions {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "PERMISSIONS")?;
if self.is_none() {
return write!(f, " NONE");
}
if self.is_full() {
return write!(f, " FULL");
}
let mut lines = Vec::<(Vec<PermissionKind>, &Permission)>::new();
for (c, permission) in [
PermissionKind::Select,
PermissionKind::Create,
PermissionKind::Update,
PermissionKind::Delete,
]
.into_iter()
.zip([&self.select, &self.create, &self.update, &self.delete])
{
if let Some((existing, _)) = lines.iter_mut().find(|(_, p)| *p == permission) {
existing.push(c);
} else {
lines.push((vec![c], permission));
}
}
let indent = if is_pretty() {
Some(pretty_indent())
} else {
f.write_char(' ')?;
None
};
for (i, (kinds, permission)) in lines.into_iter().enumerate() {
if i > 0 {
if is_pretty() {
pretty_sequence_item();
} else {
f.write_str(", ")?;
}
}
write!(f, "FOR ")?;
for (i, kind) in kinds.into_iter().enumerate() {
if i > 0 {
f.write_str(", ")?;
}
f.write_str(kind.as_str())?;
}
match permission {
Permission::Specific(_) if is_pretty() => {
let _indent = pretty_indent();
Display::fmt(permission, f)?;
}
_ => write!(f, " {permission}")?,
}
}
drop(indent);
Ok(())
}
}
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub(crate) enum PermissionKind {
Select,
Create,
Update,
Delete,
}
impl PermissionKind {
fn as_str(&self) -> &str {
match self {
PermissionKind::Select => "select",
PermissionKind::Create => "create",
PermissionKind::Update => "update",
PermissionKind::Delete => "delete",
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
#[revisioned(revision = 1)]
pub enum Permission {
None,
Full,
Specific(Value),
}
impl Default for Permission {
fn default() -> Self {
Self::Full
}
}
impl Permission {
pub fn is_none(&self) -> bool {
matches!(self, Permission::None)
}
pub fn is_full(&self) -> bool {
matches!(self, Permission::Full)
}
}
impl Display for Permission {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Self::None => f.write_str("NONE"),
Self::Full => f.write_str("FULL"),
Self::Specific(ref v) => write!(f, "WHERE {v}"),
}
}
}