webidl_utils/symbol/
with_readonly.rs

1use weedle::interface::{AttributeInterfaceMember, MaplikeInterfaceMember, SetlikeInterfaceMember};
2use weedle::mixin::AttributeMixinMember;
3
4/// A WebIDL symbol that may have a readonly modifier
5pub 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}