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