webidl_utils/symbol/
with_readonly.rs1use weedle::interface::{AttributeInterfaceMember, MaplikeInterfaceMember, SetlikeInterfaceMember};
2use weedle::mixin::AttributeMixinMember;
3
4pub trait SymbolWithReadOnly {
6 fn readonly(&self) -> Option<weedle::term::ReadOnly>;
7 fn is_readonly(&self) -> bool;
8 fn is_not_readonly(&self) -> bool;
9}
10
11macro_rules! impl_symbol_with_readonly {
12 ($($sym:ident),+ $(,)?) => {
13 $(
14 impl<'a> SymbolWithReadOnly for $sym<'a> {
15 fn readonly(&self) -> Option<weedle::term::ReadOnly> {
16 self.readonly
17 }
18
19 fn is_readonly(&self) -> bool {
20 self.readonly.is_some()
21 }
22
23 fn is_not_readonly(&self) -> bool {
24 self.readonly.is_none()
25 }
26 }
27 )+
28 };
29}
30
31impl_symbol_with_readonly!(
32 AttributeInterfaceMember,
33 MaplikeInterfaceMember,
34 SetlikeInterfaceMember,
35 AttributeMixinMember,
36);
37
38#[cfg(test)]
39mod tests {
40 use crate::symbol::SymbolWithReadOnly;
41 use weedle::interface::AttributeInterfaceMember;
42 use weedle::Parse;
43
44 #[test]
45 fn test_attribute_interface_member() {
46 let (_, member) = AttributeInterfaceMember::parse("readonly attribute float width;")
47 .expect("AttributeInterfaceMember parsed with an error");
48
49 assert!(member.readonly().is_some());
50 assert!(member.is_readonly());
51 assert!(!member.is_not_readonly());
52 }
53}