Parse version together with definitions
diff --git a/codegen/src/json.rs b/codegen/src/json.rs
index 66803ee..668c507 100644
--- a/codegen/src/json.rs
+++ b/codegen/src/json.rs
@@ -1,49 +1,14 @@
-use crate::types;
+use crate::types::Definitions;
-use serde::{Serialize, Deserialize};
-
-use std::collections::BTreeMap;
-use std::fs::{self, File};
-use std::io::prelude::*;
+use std::fs;
use std::path::Path;
-pub fn generate(defs: &types::Definitions) {
+pub fn generate(defs: &Definitions) {
+ let j = serde_json::to_string_pretty(&defs).unwrap();
+ let check: Definitions = serde_json::from_str(&j).unwrap();
+ assert_eq!(*defs, check);
+
let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
-
- let mut f = File::open(codegen_root.join("../Cargo.toml")).unwrap();
- let mut s = String::new();
- f.read_to_string(&mut s).unwrap();
-
- let manifest: Manifest = toml::from_str(&s).unwrap();
-
- let introspect = Introspect {
- version: manifest.package.version,
- types: defs.types.clone(),
- tokens: defs.tokens.clone(),
- };
-
- let j = serde_json::to_string_pretty(&introspect).unwrap();
- let check: Introspect = serde_json::from_str(&j).unwrap();
- assert_eq!(introspect, check);
-
let json_path = codegen_root.join("../syn.json");
fs::write(json_path, j).unwrap();
}
-
-#[derive(Debug, Deserialize)]
-struct Manifest {
- package: Package,
-}
-
-#[derive(Debug, Deserialize)]
-struct Package {
- version: String,
-}
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-struct Introspect {
- /// The `syn` version used to generate the introspection file
- version: String,
- types: Vec<types::Node>,
- tokens: BTreeMap<String, String>,
-}
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index 987235e..d5d3262 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -17,9 +17,10 @@
mod json;
mod parse;
mod types;
+mod version;
fn main() {
- let types = parse::parse();
- gen::generate(&types);
- json::generate(&types);
+ let defs = parse::parse();
+ gen::generate(&defs);
+ json::generate(&defs);
}
diff --git a/codegen/src/parse.rs b/codegen/src/parse.rs
index 08aefd1..c8c2a03 100644
--- a/codegen/src/parse.rs
+++ b/codegen/src/parse.rs
@@ -1,4 +1,4 @@
-use crate::types;
+use crate::{types, version};
use indexmap::IndexMap;
use quote::quote;
@@ -25,6 +25,8 @@
let token_lookup = load_token_file(TOKEN_SRC).unwrap();
+ let version = version::get();
+
let types = item_lookup
.values()
.map(|item| introspect_item(item, &item_lookup, &token_lookup))
@@ -35,7 +37,11 @@
.map(|(name, ty)| (ty, name))
.collect();
- types::Definitions { types, tokens }
+ types::Definitions {
+ version,
+ types,
+ tokens,
+ }
}
/// Data extracted from syn source
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index 0f8bd931..963441e 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -1,10 +1,12 @@
use indexmap::IndexMap;
-use serde::{Serialize, Deserialize, Deserializer};
+use serde::{Deserialize, Deserializer, Serialize};
use std::collections::{BTreeMap, BTreeSet};
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Definitions {
+ /// The Syn version used to generate the introspection file.
+ pub version: String,
pub types: Vec<Node>,
pub tokens: BTreeMap<String, String>,
}
diff --git a/codegen/src/version.rs b/codegen/src/version.rs
new file mode 100644
index 0000000..c3536c1
--- /dev/null
+++ b/codegen/src/version.rs
@@ -0,0 +1,22 @@
+use serde::Deserialize;
+
+use std::fs;
+use std::path::Path;
+
+pub fn get() -> String {
+ let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
+ let syn_cargo_toml = codegen_root.join("../Cargo.toml");
+ let manifest = fs::read_to_string(syn_cargo_toml).unwrap();
+ let parsed: Manifest = toml::from_str(&manifest).unwrap();
+ parsed.package.version
+}
+
+#[derive(Debug, Deserialize)]
+struct Manifest {
+ package: Package,
+}
+
+#[derive(Debug, Deserialize)]
+struct Package {
+ version: String,
+}