zookeeper_client/proto/
acl.rs1use 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}