Skip to main content

reifydb_core/key/
granted_role.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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		// The end key needs to be exclusive-upper, so we add a byte past the prefix
47		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}