Emit fields as a json map of name to type
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index f852308..931a30a 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -11,6 +11,7 @@
//! 3. The path to `syn` is hardcoded.
use crate::types;
+use indexmap::IndexMap;
use proc_macro2::TokenStream;
use std::fs::File;
@@ -516,21 +517,21 @@
types::Node::Struct(ref v) => {
let mut fold_fields = TokenStream::new();
- for field in v.fields() {
- let id = Ident::new(field.ident(), Span::call_site());
+ for (field, ty) in v.fields() {
+ let id = Ident::new(field, Span::call_site());
let ref_toks = Owned(quote!(_i.#id));
- let visit_field = visit(field.ty(), v.features(), defs, Visit, &ref_toks)
+ let visit_field = visit(ty, v.features(), defs, Visit, &ref_toks)
.unwrap_or_else(|| noop_visit(Visit, &ref_toks));
visit_impl.append_all(quote! {
#visit_field;
});
let visit_mut_field =
- visit(field.ty(), v.features(), defs, VisitMut, &ref_toks)
+ visit(ty, v.features(), defs, VisitMut, &ref_toks)
.unwrap_or_else(|| noop_visit(VisitMut, &ref_toks));
visit_mut_impl.append_all(quote! {
#visit_mut_field;
});
- let fold = visit(field.ty(), v.features(), defs, Fold, &ref_toks)
+ let fold = visit(ty, v.features(), defs, Fold, &ref_toks)
.unwrap_or_else(|| noop_visit(Fold, &ref_toks));
fold_fields.append_all(quote! {
@@ -645,7 +646,7 @@
defs.insert(types::Node::Struct(types::Struct::new(
tt.to_string(),
types::Features::default(),
- vec![],
+ IndexMap::new(),
true)
));
}
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index 1860211..7ec9d2e 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -13,6 +13,7 @@
#![recursion_limit = "128"]
#![allow(clippy::needless_pass_by_value)]
+extern crate indexmap;
extern crate inflections;
extern crate proc_macro2;
#[macro_use]
diff --git a/codegen/src/parse.rs b/codegen/src/parse.rs
index 5af7df2..3ec3142 100644
--- a/codegen/src/parse.rs
+++ b/codegen/src/parse.rs
@@ -1,5 +1,6 @@
use crate::types;
+use indexmap::IndexMap;
use syn::{Data, DataStruct, DeriveInput, Ident, Item};
use std::collections::BTreeMap;
@@ -107,13 +108,13 @@
all_fields_pub = false;
}
- types::Field::new(
+ (
field.ident.as_ref().unwrap().to_string(),
introspect_type(&field.ty, items, tokens),
)
})
.collect(),
- syn::Fields::Unit => vec![],
+ syn::Fields::Unit => IndexMap::new(),
_ => panic!("Struct representation not supported"),
};
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index 32328dc..8fee440 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -1,3 +1,5 @@
+use indexmap::IndexMap;
+
use std::collections::BTreeMap;
use std::ops;
@@ -18,7 +20,7 @@
pub struct Struct {
ident: String,
features: Features,
- fields: Vec<Field>,
+ fields: IndexMap<String, Type>,
all_fields_pub: bool,
}
@@ -36,13 +38,6 @@
}
#[derive(Debug, Clone, Serialize)]
-pub struct Field {
- ident: String,
- #[serde(rename = "type")]
- ty: Type,
-}
-
-#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Type {
/// Type defined by `syn`
@@ -107,7 +102,7 @@
pub fn new(
ident: String,
features: Features,
- fields: Vec<Field>,
+ fields: IndexMap<String, Type>,
all_fields_pub: bool,
) -> Struct {
Struct {
@@ -122,7 +117,7 @@
&self.features
}
- pub fn fields(&self) -> &[Field] {
+ pub fn fields(&self) -> &IndexMap<String, Type> {
&self.fields
}
@@ -159,20 +154,6 @@
}
}
-impl Field {
- pub fn new(ident: String, ty: Type) -> Field {
- Field { ident, ty }
- }
-
- pub fn ident(&self) -> &str {
- &self.ident
- }
-
- pub fn ty(&self) -> &Type {
- &self.ty
- }
-}
-
impl Punctuated {
pub fn new(element: Type, punct: String) -> Self {
Punctuated { element: Box::new(element), punct }