surrealdb_core/key/namespace/access/
gr.rs1use 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}