pilota_thrift_parser/parser/
namespace.rs1use 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}