reifydb_core/key/
granted_role.rs1use reifydb_type::value::identity::IdentityId;
5
6use super::{EncodableKey, KeyKind};
7use crate::{
8 encoded::key::{EncodedKey, EncodedKeyRange},
9 interface::catalog::identity::RoleId,
10 util::encoding::keycode::{deserializer::KeyDeserializer, serializer::KeySerializer},
11};
12
13const VERSION: u8 = 1;
14
15#[derive(Debug, Clone, PartialEq)]
16pub struct GrantedRoleKey {
17 pub identity: IdentityId,
18 pub role: RoleId,
19}
20
21impl GrantedRoleKey {
22 pub fn new(identity: IdentityId, role: RoleId) -> Self {
23 Self {
24 identity,
25 role,
26 }
27 }
28
29 pub fn encoded(identity: IdentityId, role: RoleId) -> EncodedKey {
30 Self::new(identity, role).encode()
31 }
32
33 pub fn full_scan() -> EncodedKeyRange {
34 let mut start = KeySerializer::with_capacity(2);
35 start.extend_u8(VERSION).extend_u8(Self::KIND as u8);
36 let mut end = KeySerializer::with_capacity(2);
37 end.extend_u8(VERSION).extend_u8(Self::KIND as u8 - 1);
38 EncodedKeyRange::start_end(Some(start.to_encoded_key()), Some(end.to_encoded_key()))
39 }
40
41 pub fn identity_scan(identity: IdentityId) -> EncodedKeyRange {
42 let mut start = KeySerializer::with_capacity(18);
43 start.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_identity_id(&identity);
44 let mut end = KeySerializer::with_capacity(18);
45 end.extend_u8(VERSION).extend_u8(Self::KIND as u8).extend_identity_id(&identity);
46 let start_key = start.to_encoded_key();
48 let mut end_bytes = end.to_encoded_key().to_vec();
49 end_bytes.push(0xFF);
50 EncodedKeyRange::start_end(Some(start_key), Some(EncodedKey::new(end_bytes)))
51 }
52}
53
54impl EncodableKey for GrantedRoleKey {
55 const KIND: KeyKind = KeyKind::GrantedRole;
56
57 fn encode(&self) -> EncodedKey {
58 let mut serializer = KeySerializer::with_capacity(26);
59 serializer
60 .extend_u8(VERSION)
61 .extend_u8(Self::KIND as u8)
62 .extend_identity_id(&self.identity)
63 .extend_u64(self.role);
64 serializer.to_encoded_key()
65 }
66
67 fn decode(key: &EncodedKey) -> Option<Self> {
68 let mut de = KeyDeserializer::from_bytes(key.as_slice());
69 let version = de.read_u8().ok()?;
70 if version != VERSION {
71 return None;
72 }
73 let kind: KeyKind = de.read_u8().ok()?.try_into().ok()?;
74 if kind != Self::KIND {
75 return None;
76 }
77 let identity = de.read_identity_id().ok()?;
78 let role = de.read_u64().ok()?;
79 Some(Self {
80 identity,
81 role,
82 })
83 }
84}