blob: ebd3c8e8530f4f134aa33b3f058999c8705d6b45 [file] [log] [blame]
David Tolnay35161ff2016-09-03 11:33:15 -07001#[macro_use]
2extern crate nom;
3
David Tolnayb79ee962016-09-04 09:39:20 -07004#[macro_use]
David Tolnay6b7aaf02016-09-04 10:39:25 -07005mod do_parse;
6
7#[macro_use]
David Tolnayb79ee962016-09-04 09:39:20 -07008mod helper;
David Tolnay35161ff2016-09-03 11:33:15 -07009
David Tolnayb79ee962016-09-04 09:39:20 -070010mod attr;
11pub use attr::{
12 Attribute,
13 MetaItem,
14};
David Tolnay35161ff2016-09-03 11:33:15 -070015
David Tolnayb79ee962016-09-04 09:39:20 -070016mod common;
17pub use common::{
18 Ident,
19 Visibility,
20};
David Tolnay35161ff2016-09-03 11:33:15 -070021
David Tolnayb79ee962016-09-04 09:39:20 -070022mod generics;
23pub use generics::{
24 Generics,
25 Lifetime,
26 LifetimeDef,
27 TyParam,
28 TyParamBound,
29 WhereBoundPredicate,
30 WherePredicate,
31 WhereRegionPredicate,
32};
David Tolnay35161ff2016-09-03 11:33:15 -070033
David Tolnayb79ee962016-09-04 09:39:20 -070034mod item;
35pub use item::{
36 Body,
37 Field,
38 Item,
39 Style,
40 Variant,
41};
David Tolnay35161ff2016-09-03 11:33:15 -070042
David Tolnayb79ee962016-09-04 09:39:20 -070043mod ty;
44pub use ty::{
45 AngleBracketedParameterData,
46 Arg,
47 BareFnTy,
48 FnDecl,
49 FunctionRetTy,
50 MutTy,
51 Mutability,
52 ParenthesizedParameterData,
53 Path,
54 PathParameters,
55 PathSegment,
56 PolyTraitRef,
57 QSelf,
58 Ty,
59 TypeBinding,
60};
David Tolnay35161ff2016-09-03 11:33:15 -070061
David Tolnay7ebb9fb2016-09-03 12:07:47 -070062pub fn parse(input: &str) -> Item {
David Tolnayb79ee962016-09-04 09:39:20 -070063 match item::item(input) {
64 nom::IResult::Done(rest, ast) => {
David Tolnay35161ff2016-09-03 11:33:15 -070065 if rest.is_empty() {
David Tolnay7ebb9fb2016-09-03 12:07:47 -070066 ast
David Tolnay35161ff2016-09-03 11:33:15 -070067 } else {
David Tolnay7ebb9fb2016-09-03 12:07:47 -070068 panic!("more than a single input item: {:?}", rest)
David Tolnay35161ff2016-09-03 11:33:15 -070069 }
70 }
David Tolnayb79ee962016-09-04 09:39:20 -070071 nom::IResult::Error(err) => raise(err),
72 nom::IResult::Incomplete(_) => panic!("incomplete input item"),
David Tolnay7ebb9fb2016-09-03 12:07:47 -070073 }
74}
75
76fn raise(mut err: nom::Err<&str>) -> ! {
77 loop {
78 match err {
79 nom::Err::Code(kind) => {
80 panic!("failed to parse {:?}", kind)
81 }
82 nom::Err::Position(kind, pos) => {
83 panic!("failed to parse {:?}: {:?}", kind, pos)
84 }
85 nom::Err::Node(_, next) |
86 nom::Err::NodePosition(_, _, next) => {
87 err = *next;
88 }
David Tolnay35161ff2016-09-03 11:33:15 -070089 }
David Tolnay35161ff2016-09-03 11:33:15 -070090 }
91}