pilota_thrift_parser/parser/
namespace.rs

1use nom::{
2    IResult,
3    bytes::complete::tag,
4    combinator::{map, opt},
5    sequence::{preceded, tuple},
6};
7
8use super::super::{descriptor::Annotations, parser::*};
9use crate::{Namespace, Scope};
10
11impl Parser for Namespace {
12    fn parse(input: &str) -> IResult<&str, Namespace> {
13        map(
14            tuple((
15                tag("namespace"),
16                preceded(blank, Scope::parse),
17                preceded(blank, Path::parse),
18                opt(blank),
19                opt(Annotations::parse),
20                opt(blank),
21                opt(list_separator),
22            )),
23            |(_, scope, name, _, annotations, _, _)| Namespace {
24                scope,
25                name,
26                annotations,
27            },
28        )(input)
29    }
30}
31
32impl Parser for Scope {
33    fn parse(input: &str) -> IResult<&str, Scope> {
34        map(
35            nom::bytes::complete::take_while1(|c: char| !c.is_whitespace()),
36            |s: &str| Scope(s.into()),
37        )(input)
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn test_scope() {
47        let input = "cocoa ";
48        let (remaining, scope) = Scope::parse(input).unwrap();
49        assert_eq!(scope.0, "cocoa");
50        assert_eq!(remaining, " ");
51
52        let input = "*";
53        let (_, scope) = Scope::parse(input).unwrap();
54        assert_eq!(scope.0, "*");
55
56        let input = "py.twisted";
57        let (_, scope) = Scope::parse(input).unwrap();
58        assert_eq!(scope.0, "py.twisted");
59
60        let input = "  ";
61        let res = Scope::parse(input);
62        assert!(res.is_err());
63    }
64
65    #[test]
66    fn test_namespace() {
67        let input = "namespace cocoa java.lang.Object";
68        let (_, namespace) = Namespace::parse(input).unwrap();
69        assert_eq!(namespace.scope.0, "cocoa");
70        assert_eq!(
71            namespace
72                .name
73                .segments
74                .iter()
75                .map(|s| s.to_string())
76                .collect::<Vec<_>>(),
77            vec!["java", "lang", "Object"]
78        );
79    }
80}