blob: 66803ee7079525f05013546b5320834c3c9cc604 [file] [log] [blame]
Carl Lerche9a7d5882019-02-15 12:27:04 -08001use crate::types;
2
David Tolnay397bd0b2019-02-15 20:51:10 -08003use serde::{Serialize, Deserialize};
4
David Tolnayf9bb8ff2019-02-15 13:10:14 -08005use std::collections::BTreeMap;
David Tolnay07b2cca2019-02-15 18:58:27 -08006use std::fs::{self, File};
Carl Lerche9a7d5882019-02-15 12:27:04 -08007use std::io::prelude::*;
8use std::path::Path;
9
David Tolnayf9bb8ff2019-02-15 13:10:14 -080010pub fn generate(defs: &types::Definitions) {
Carl Lerche9a7d5882019-02-15 12:27:04 -080011 let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
12
13 let mut f = File::open(codegen_root.join("../Cargo.toml")).unwrap();
14 let mut s = String::new();
15 f.read_to_string(&mut s).unwrap();
16
17 let manifest: Manifest = toml::from_str(&s).unwrap();
18
David Tolnay07b2cca2019-02-15 18:58:27 -080019 let introspect = Introspect {
20 version: manifest.package.version,
21 types: defs.types.clone(),
22 tokens: defs.tokens.clone(),
23 };
Carl Lerche9a7d5882019-02-15 12:27:04 -080024
David Tolnay07b2cca2019-02-15 18:58:27 -080025 let j = serde_json::to_string_pretty(&introspect).unwrap();
26 let check: Introspect = serde_json::from_str(&j).unwrap();
27 assert_eq!(introspect, check);
28
29 let json_path = codegen_root.join("../syn.json");
30 fs::write(json_path, j).unwrap();
Carl Lerche9a7d5882019-02-15 12:27:04 -080031}
32
33#[derive(Debug, Deserialize)]
34struct Manifest {
35 package: Package,
36}
37
38#[derive(Debug, Deserialize)]
39struct Package {
40 version: String,
41}
42
David Tolnay07b2cca2019-02-15 18:58:27 -080043#[derive(Debug, PartialEq, Serialize, Deserialize)]
44struct Introspect {
Carl Lerche9a7d5882019-02-15 12:27:04 -080045 /// The `syn` version used to generate the introspection file
David Tolnay07b2cca2019-02-15 18:58:27 -080046 version: String,
47 types: Vec<types::Node>,
48 tokens: BTreeMap<String, String>,
Carl Lerche9a7d5882019-02-15 12:27:04 -080049}