webidl_utils/symbol/
with_identifier.rs1use 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
9pub 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}