1 use super::*; 2 3 #[derive(Debug, Clone, Eq, PartialEq, Hash)] 4 pub struct Crate { 5 pub shebang: Option<String>, 6 pub attrs: Vec<Attribute>, 7 pub items: Vec<Item>, 8 } 9 10 #[cfg(feature = "parsing")] 11 pub mod parsing { 12 use super::*; 13 use attr::parsing::inner_attr; 14 use item::parsing::items; 15 16 named!(pub krate -> Crate, do_parse!( 17 option!(byte_order_mark) >> 18 shebang: option!(shebang) >> 19 attrs: many0!(inner_attr) >> 20 items: items >> 21 (Crate { 22 shebang: shebang, 23 attrs: attrs, 24 items: items, 25 }) 26 )); 27 28 named!(byte_order_mark -> &str, tag!("\u{feff}")); 29 30 named!(shebang -> String, do_parse!( 31 tag!("#!") >> 32 not!(tag!("[")) >> 33 content: take_until!("\n") >> 34 (format!("#!{}", content)) 35 )); 36 } 37 38 #[cfg(feature = "printing")] 39 mod printing { 40 use super::*; 41 use attr::FilterAttrs; 42 use quote::{Tokens, ToTokens}; 43 44 impl ToTokens for Crate { to_tokens(&self, tokens: &mut Tokens)45 fn to_tokens(&self, tokens: &mut Tokens) { 46 if let Some(ref shebang) = self.shebang { 47 tokens.append(&format!("{}\n", shebang)); 48 } 49 for attr in self.attrs.inner() { 50 attr.to_tokens(tokens); 51 } 52 for item in &self.items { 53 item.to_tokens(tokens); 54 } 55 } 56 } 57 } 58