webidl_utils/symbol/
with_identifier.rs

1use weedle::argument::{SingleArgument, VariadicArgument};
2use weedle::attribute::ExtendedAttributeNoArgs;
3use weedle::dictionary::DictionaryMember;
4use weedle::interface::{AttributeInterfaceMember, ConstMember, Inheritance};
5use weedle::mixin::AttributeMixinMember;
6use weedle::namespace::AttributeNamespaceMember;
7use weedle::*;
8
9/// A WebIDL symbol with an identifier
10pub trait SymbolWithIdentifier<'a> {
11	fn identifier(&self) -> weedle::common::Identifier<'a>;
12}
13
14impl<'a> SymbolWithIdentifier<'a> for ExtendedAttributeNoArgs<'a> {
15	fn identifier(&self) -> weedle::common::Identifier<'a> {
16		self.0
17	}
18}
19
20macro_rules! impl_symbol_with_identifier {
21	($($sym:ident),+ $(,)?) => {
22		$(
23			impl<'a> SymbolWithIdentifier<'a> for $sym<'a> {
24				fn identifier(&self) -> weedle::common::Identifier<'a> {
25					self.identifier
26				}
27			}
28		)+
29	}
30}
31
32impl_symbol_with_identifier!(
33	CallbackDefinition,
34	CallbackInterfaceDefinition,
35	DictionaryDefinition,
36	EnumDefinition,
37	InterfaceDefinition,
38	InterfaceMixinDefinition,
39	NamespaceDefinition,
40	PartialDictionaryDefinition,
41	PartialInterfaceDefinition,
42	PartialInterfaceMixinDefinition,
43	PartialNamespaceDefinition,
44	TypedefDefinition,
45	SingleArgument,
46	VariadicArgument,
47	DictionaryMember,
48	ConstMember,
49	AttributeInterfaceMember,
50	AttributeMixinMember,
51	AttributeNamespaceMember,
52	Inheritance,
53);
54
55#[cfg(test)]
56mod test {
57	use crate::symbol::SymbolWithIdentifier;
58	use weedle::attribute::ExtendedAttributeNoArgs;
59	use weedle::common::Identifier;
60	use weedle::{CallbackDefinition, Parse};
61
62	#[test]
63	fn test_extended_attribute_no_args() {
64		let test = ExtendedAttributeNoArgs(Identifier("FooBar"));
65		assert_eq!(test.identifier(), Identifier("FooBar"));
66	}
67
68	#[test]
69	fn test_callback_definition() {
70		let (_, callback) = CallbackDefinition::parse(
71			"callback AudioDataOutputCallback = undefined(AudioData output);",
72		)
73		.expect("WebIDL callback parsed with an error");
74
75		assert_eq!(callback.identifier(), Identifier("AudioDataOutputCallback"));
76	}
77}