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 | |
David Tolnay | 47fe740 | 2019-02-15 14:35:25 -0800 | [diff] [blame] | 19 | serde_json::to_writer_pretty( |
| 20 | f, |
| 21 | &Introspect { |
| 22 | version: &manifest.package.version, |
| 23 | types: &defs.types, |
| 24 | tokens: &defs.tokens, |
| 25 | }, |
| 26 | ) |
| 27 | .unwrap(); |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 28 | } |
| 29 | |
| 30 | #[derive(Debug, Deserialize)] |
| 31 | struct Manifest { |
| 32 | package: Package, |
| 33 | } |
| 34 | |
| 35 | #[derive(Debug, Deserialize)] |
| 36 | struct Package { |
| 37 | version: String, |
| 38 | } |
| 39 | |
| 40 | #[derive(Debug, Serialize)] |
| 41 | struct Introspect<'a> { |
| 42 | /// The `syn` version used to generate the introspection file |
| 43 | version: &'a str, |
David Tolnay | f9bb8ff | 2019-02-15 13:10:14 -0800 | [diff] [blame] | 44 | types: &'a [types::Node], |
| 45 | tokens: &'a BTreeMap<String, String>, |
Carl Lerche | 9a7d588 | 2019-02-15 12:27:04 -0800 | [diff] [blame] | 46 | } |