surrealdb_core/key/namespace/access/
gr.rs

1//! Stores a grant associated with an access method
2use crate::err::Error;
3use crate::key::category::Categorise;
4use crate::key::category::Category;
5use crate::kvs::{impl_key, KeyEncode};
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize)]
9#[non_exhaustive]
10pub struct Gr<'a> {
11	__: u8,
12	_a: u8,
13	pub ns: &'a str,
14	_b: u8,
15	pub ac: &'a str,
16	_c: u8,
17	_d: u8,
18	_e: u8,
19	pub gr: &'a str,
20}
21impl_key!(Gr<'a>);
22
23pub fn new<'a>(ns: &'a str, ac: &'a str, gr: &'a str) -> Gr<'a> {
24	Gr::new(ns, ac, gr)
25}
26
27pub fn prefix(ns: &str, ac: &str) -> Result<Vec<u8>, Error> {
28	let mut k = super::all::new(ns, ac).encode()?;
29	k.extend_from_slice(b"!gr\x00");
30	Ok(k)
31}
32
33pub fn suffix(ns: &str, ac: &str) -> Result<Vec<u8>, Error> {
34	let mut k = super::all::new(ns, ac).encode()?;
35	k.extend_from_slice(b"!gr\xff");
36	Ok(k)
37}
38
39impl Categorise for Gr<'_> {
40	fn categorise(&self) -> Category {
41		Category::NamespaceAccessGrant
42	}
43}
44
45impl<'a> Gr<'a> {
46	pub fn new(ns: &'a str, ac: &'a str, gr: &'a str) -> Self {
47		Self {
48			__: b'/',
49			_a: b'*',
50			ns,
51			_b: b'&',
52			ac,
53			_c: b'!',
54			_d: b'g',
55			_e: b'r',
56			gr,
57		}
58	}
59}
60
61#[cfg(test)]
62mod tests {
63	use crate::kvs::KeyDecode;
64	#[test]
65	fn key() {
66		use super::*;
67		#[rustfmt::skip]
68		let val = Gr::new(
69			"testns",
70			"testac",
71			"testgr",
72		);
73		let enc = Gr::encode(&val).unwrap();
74		assert_eq!(enc, b"/*testns\0&testac\0!grtestgr\0");
75
76		let dec = Gr::decode(&enc).unwrap();
77		assert_eq!(val, dec);
78	}
79
80	#[test]
81	fn test_prefix() {
82		let val = super::prefix("testns", "testac").unwrap();
83		assert_eq!(val, b"/*testns\0&testac\0!gr\0");
84	}
85
86	#[test]
87	fn test_suffix() {
88		let val = super::suffix("testns", "testac").unwrap();
89		assert_eq!(val, b"/*testns\0&testac\0!gr\xff");
90	}
91}