1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#[cfg(feature = "parsing")]
#[macro_use]
extern crate nom;

#[cfg(feature = "printing")]
extern crate quote;

#[macro_use]
mod do_parse;

#[macro_use]
mod helper;

mod attr;
pub use attr::{
    Attribute,
    MetaItem,
};

mod common;
pub use common::{
    Ident,
    Visibility,
};

mod generics;
pub use generics::{
    Generics,
    Lifetime,
    LifetimeDef,
    TyParam,
    TyParamBound,
    WhereBoundPredicate,
    WherePredicate,
    WhereRegionPredicate,
};

mod item;
pub use item::{
    Body,
    Field,
    Item,
    Style,
    Variant,
};

mod ty;
pub use ty::{
    AngleBracketedParameterData,
    BareFnTy,
    FnArg,
    FnDecl,
    FunctionRetTy,
    MutTy,
    Mutability,
    ParenthesizedParameterData,
    Path,
    PathParameters,
    PathSegment,
    PolyTraitRef,
    QSelf,
    Ty,
    TypeBinding,
};

#[cfg(feature = "parsing")]
pub fn parse_item(input: &str) -> Item {
    return match item::parsing::item(input) {
        nom::IResult::Done(rest, ast) => {
            if rest.is_empty() {
                ast
            } else {
                panic!("more than a single input item: {:?}", rest)
            }
        }
        nom::IResult::Error(err) => raise(err),
        nom::IResult::Incomplete(_) => panic!("incomplete input item"),
    };

    fn raise(mut err: nom::Err<&str>) -> ! {
        loop {
            match err {
                nom::Err::Code(kind) => {
                    panic!("failed to parse {:?}", kind)
                }
                nom::Err::Position(kind, pos) => {
                    panic!("failed to parse {:?}: {:?}", kind, pos)
                }
                nom::Err::Node(_, next) |
                nom::Err::NodePosition(_, _, next) => {
                    err = *next;
                }
            }
        }
    }
}