weedle/
dictionary.rs

1use crate::attribute::ExtendedAttributeList;
2use crate::common::{Default, Identifier};
3use crate::types::AttributedType;
4
5/// Parses dictionary members
6pub type DictionaryMembers<'a> = Vec<DictionaryMember<'a>>;
7
8ast_types! {
9    /// Parses dictionary member `[attributes]? required? attributedtype identifier ( = default )?;`
10    struct DictionaryMember<'a> {
11        attributes: Option<ExtendedAttributeList<'a>>,
12        required: Option<term!(required)>,
13        type_: AttributedType<'a>,
14        identifier: Identifier<'a>,
15        default: Option<Default<'a>>,
16        semi_colon: term!(;),
17    }
18}
19
20#[cfg(test)]
21mod test {
22    use super::*;
23    use crate::Parse;
24
25    test!(should_parse_dictionary_member { "required long num = 5;" =>
26        "";
27        DictionaryMember;
28        attributes.is_none();
29        required.is_some();
30        identifier.0 == "num";
31        default.is_some();
32    });
33
34    test!(should_parse_dictionary_member_with_attributed_type { "required [EnforceRange] unsigned long num = 5;" =>
35        "";
36        DictionaryMember;
37        attributes.is_none();
38        required.is_some();
39        identifier.0 == "num";
40        default.is_some();
41        type_.attributes.is_some();
42    });
43}