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; } } } } }