surrealdb_core/iam/entities/
roles.rs

1use std::str::FromStr;
2
3use revision::revisioned;
4use serde::{Deserialize, Serialize};
5
6use crate::expr::Ident;
7use crate::iam::Error;
8
9// In the future, we will allow for custom roles. For now, provide predefined
10// roles.
11#[revisioned(revision = 1)]
12#[derive(Hash, Copy, Clone, Default, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize)]
13#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
14#[non_exhaustive]
15pub enum Role {
16	#[default]
17	Viewer,
18	Editor,
19	Owner,
20}
21
22impl std::fmt::Display for Role {
23	fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
24		match self {
25			Self::Viewer => write!(f, "Viewer"),
26			Self::Editor => write!(f, "Editor"),
27			Self::Owner => write!(f, "Owner"),
28		}
29	}
30}
31
32impl FromStr for Role {
33	type Err = Error;
34	fn from_str(s: &str) -> Result<Self, Self::Err> {
35		match s.to_ascii_lowercase().as_str() {
36			"viewer" => Ok(Self::Viewer),
37			"editor" => Ok(Self::Editor),
38			"owner" => Ok(Self::Owner),
39			_ => Err(Error::InvalidRole(s.to_string())),
40		}
41	}
42}
43
44impl std::convert::From<Role> for Ident {
45	fn from(role: Role) -> Self {
46		match role {
47			Role::Viewer => unsafe { Ident::new_unchecked("Viewer".to_owned()) },
48			Role::Editor => unsafe { Ident::new_unchecked("Editor".to_owned()) },
49			Role::Owner => unsafe { Ident::new_unchecked("Owner".to_owned()) },
50		}
51	}
52}