Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 1 | use crate::types; |
| 2 | |
David Tolnay | f9bb8ff | 2019-02-15 13:10:14 -0800 | [diff] [blame^] | 3 | use std::collections::BTreeMap; |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 4 | use std::fs::File; |
| 5 | use std::io::prelude::*; |
| 6 | use std::path::Path; |
| 7 | |
David Tolnay | f9bb8ff | 2019-02-15 13:10:14 -0800 | [diff] [blame^] | 8 | pub fn generate(defs: &types::Definitions) { |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 9 | let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR")); |
| 10 | |
| 11 | let mut f = File::open(codegen_root.join("../Cargo.toml")).unwrap(); |
| 12 | let mut s = String::new(); |
| 13 | f.read_to_string(&mut s).unwrap(); |
| 14 | |
| 15 | let manifest: Manifest = toml::from_str(&s).unwrap(); |
| 16 | |
| 17 | let f = ::std::fs::File::create(codegen_root.join("../syn.json")).unwrap(); |
| 18 | |
| 19 | serde_json::to_writer_pretty(f, &Introspect { |
| 20 | version: &manifest.package.version, |
David Tolnay | f9bb8ff | 2019-02-15 13:10:14 -0800 | [diff] [blame^] | 21 | types: &defs.types, |
| 22 | tokens: &defs.tokens, |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 23 | }).unwrap(); |
| 24 | } |
| 25 | |
| 26 | #[derive(Debug, Deserialize)] |
| 27 | struct Manifest { |
| 28 | package: Package, |
| 29 | } |
| 30 | |
| 31 | #[derive(Debug, Deserialize)] |
| 32 | struct Package { |
| 33 | version: String, |
| 34 | } |
| 35 | |
| 36 | #[derive(Debug, Serialize)] |
| 37 | struct Introspect<'a> { |
| 38 | /// The `syn` version used to generate the introspection file |
| 39 | version: &'a str, |
David Tolnay | f9bb8ff | 2019-02-15 13:10:14 -0800 | [diff] [blame^] | 40 | types: &'a [types::Node], |
| 41 | tokens: &'a BTreeMap<String, String>, |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 42 | } |