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