zookeeper_client/proto/
acl.rs

1use bytes::BufMut;
2
3use super::stat::Stat;
4use crate::acl::{Acl, AuthId, Permission};
5use crate::chroot::ChrootPath;
6use crate::record::{
7    self,
8    DeserializableRecord,
9    DeserializeError,
10    DynamicRecord,
11    InvalidData,
12    ReadingBuf,
13    SerializableRecord,
14};
15
16impl SerializableRecord for Acl {
17    fn serialize(&self, buf: &mut dyn BufMut) {
18        buf.put_i32(self.permission().into_raw());
19        self.scheme().serialize(buf);
20        self.id().serialize(buf);
21    }
22}
23
24impl DynamicRecord for Acl {
25    fn serialized_len(&self) -> usize {
26        4 + self.scheme().serialized_len() + self.id().serialized_len()
27    }
28}
29
30impl TryFrom<i32> for Permission {
31    type Error = InvalidData;
32
33    fn try_from(raw: i32) -> Result<Permission, Self::Error> {
34        let all_bits = Permission::ALL.into_raw();
35        if (raw & !all_bits) != 0 {
36            return Err(InvalidData::UnmarshalError(format!("invalid permission bits: {raw:#b}")));
37        }
38        Ok(Permission::from_raw(raw))
39    }
40}
41
42impl DeserializableRecord<'_> for Acl {
43    type Error = DeserializeError;
44
45    fn deserialize(buf: &mut ReadingBuf) -> Result<Self, Self::Error> {
46        let perms = i32::deserialize(buf)?;
47        let scheme: &str = record::deserialize(buf)?;
48        let id: &str = record::deserialize(buf)?;
49        let permission = Permission::try_from(perms)?;
50        let auth_id = AuthId::new(scheme, id);
51        Ok(Acl::new(permission, auth_id))
52    }
53}
54
55pub struct SetAclRequest<'a> {
56    pub path: ChrootPath<'a>,
57    pub acl: &'a [Acl],
58    pub version: i32,
59}
60
61impl SerializableRecord for SetAclRequest<'_> {
62    fn serialize(&self, buf: &mut dyn BufMut) {
63        self.path.serialize(buf);
64        self.acl.serialize(buf);
65        self.version.serialize(buf);
66    }
67}
68
69impl DynamicRecord for SetAclRequest<'_> {
70    fn serialized_len(&self) -> usize {
71        self.path.serialized_len() + self.acl.serialized_len() + self.version.serialized_len()
72    }
73}
74
75pub struct GetAclResponse {
76    pub acl: Vec<Acl>,
77    pub stat: Stat,
78}
79
80impl DeserializableRecord<'_> for GetAclResponse {
81    type Error = DeserializeError;
82
83    fn deserialize(buf: &mut ReadingBuf) -> Result<Self, Self::Error> {
84        let acl = record::deserialize::<Vec<Acl>>(buf)?;
85        let stat = record::deserialize::<Stat>(buf)?;
86        Ok(GetAclResponse { acl, stat })
87    }
88}