Skip to main content

xmtp_mls_common/app_data/
component_permissions.rs

1use xmtp_proto::xmtp::mls::message_contents::{
2    ComponentPermissions, MetadataPolicy as MetadataPolicyProto,
3};
4
5/// Builder for [`ComponentPermissions`].
6///
7/// Construct via the generated builder rather than positional arguments so
8/// that the three same-typed `MetadataPolicyProto` arguments
9/// (`insert`/`update`/`delete`) can't be accidentally swapped at the call
10/// site:
11///
12/// ```ignore
13/// let perms = component_permissions()
14///     .insert(allow_policy)
15///     .update(admin_only_policy)
16///     .delete(super_admin_only_policy)
17///     .call();
18/// ```
19#[bon::builder]
20pub fn component_permissions(
21    insert: MetadataPolicyProto,
22    update: MetadataPolicyProto,
23    delete: MetadataPolicyProto,
24) -> ComponentPermissions {
25    ComponentPermissions {
26        insert_policy: Some(insert),
27        update_policy: Some(update),
28        delete_policy: Some(delete),
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    use prost::Message;
36    use xmtp_proto::xmtp::mls::message_contents::metadata_policy::{
37        Kind as MetadataPolicyKind, MetadataBasePolicy,
38    };
39
40    fn make_base_policy(base: MetadataBasePolicy) -> MetadataPolicyProto {
41        MetadataPolicyProto {
42            kind: Some(MetadataPolicyKind::Base(base as i32)),
43        }
44    }
45
46    fn allow() -> MetadataPolicyProto {
47        make_base_policy(MetadataBasePolicy::Allow)
48    }
49
50    fn deny() -> MetadataPolicyProto {
51        make_base_policy(MetadataBasePolicy::Deny)
52    }
53
54    fn admin_only() -> MetadataPolicyProto {
55        make_base_policy(MetadataBasePolicy::AllowIfAdmin)
56    }
57
58    #[xmtp_common::test]
59    fn test_permission_encode_decode_round_trip() {
60        let perm = component_permissions()
61            .insert(allow())
62            .update(admin_only())
63            .delete(deny())
64            .call();
65        let bytes = perm.encode_to_vec();
66        let decoded = ComponentPermissions::decode(bytes.as_slice()).unwrap();
67        assert_eq!(perm, decoded);
68    }
69
70    #[xmtp_common::test]
71    fn test_all_deny() {
72        let perm = component_permissions()
73            .insert(deny())
74            .update(deny())
75            .delete(deny())
76            .call();
77        let bytes = perm.encode_to_vec();
78        let decoded = ComponentPermissions::decode(bytes.as_slice()).unwrap();
79        assert_eq!(perm, decoded);
80    }
81
82    #[xmtp_common::test]
83    fn test_builder_sets_all_fields() {
84        let perm = component_permissions()
85            .insert(allow())
86            .update(admin_only())
87            .delete(deny())
88            .call();
89        assert!(perm.insert_policy.is_some());
90        assert!(perm.update_policy.is_some());
91        assert!(perm.delete_policy.is_some());
92    }
93}