webidl_utils/symbol/
with_optional_identifier.rs

1use weedle::interface::OperationInterfaceMember;
2use weedle::mixin::OperationMixinMember;
3use weedle::namespace::OperationNamespaceMember;
4
5/// A WebIDL symbol that may have an identifier
6pub trait SymbolWithOptionalIdentifier<'a> {
7	fn identifier(&self) -> Option<weedle::common::Identifier<'a>>;
8	fn has_identifier(&self) -> bool;
9}
10
11macro_rules! impl_symbol_with_optional_identifier {
12	($($sym:ident),+ $(,)?) => {
13		$(
14			impl<'a> SymbolWithOptionalIdentifier<'a> for $sym<'a> {
15				fn identifier(&self) -> Option<weedle::common::Identifier<'a>> {
16					self.identifier
17				}
18
19				fn has_identifier(&self) -> bool {
20					self.identifier.is_some()
21				}
22			}
23		)+
24	};
25}
26
27impl_symbol_with_optional_identifier!(
28	OperationInterfaceMember,
29	OperationMixinMember,
30	OperationNamespaceMember,
31);
32
33#[cfg(test)]
34mod tests {
35	use crate::symbol::SymbolWithOptionalIdentifier;
36	use weedle::common::Identifier;
37	use weedle::interface::OperationInterfaceMember;
38	use weedle::Parse;
39
40	#[test]
41	fn test_operation_interface_member() {
42		let (_, output) = OperationInterfaceMember::parse(
43			"static Promise<boolean> isTypeSupported(DOMString type);",
44		)
45		.expect("OperationInterfaceMember parsed with an error");
46
47		assert_eq!(output.identifier(), Some(Identifier("isTypeSupported")));
48		assert!(output.has_identifier());
49	}
50}