add todomvc crate and fix clippy stuff
This commit is contained in:
parent
1453885ed2
commit
3422ae6423
11 changed files with 41 additions and 61 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -370,6 +370,10 @@ dependencies = [
|
||||||
"syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "todomvc"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
|
|
@ -13,6 +13,7 @@ members = [
|
||||||
"syn-serde",
|
"syn-serde",
|
||||||
|
|
||||||
"examples/helloworld",
|
"examples/helloworld",
|
||||||
|
"examples/todomvc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
|
@ -1,25 +1,22 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate quote;
|
extern crate quote;
|
||||||
#[macro_use]
|
|
||||||
extern crate maplit;
|
extern crate maplit;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
pub mod model;
|
pub mod model;
|
||||||
mod visitor;
|
|
||||||
mod tuple_map;
|
mod tuple_map;
|
||||||
|
mod visitor;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use crate::model::{Component, Elem, Rsx, TagLhs};
|
use crate::model::Component;
|
||||||
use crate::visitor::Visitor;
|
use crate::visitor::Visitor;
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use symbol::Symbol;
|
use symbol::Symbol;
|
||||||
use syn::Expr;
|
|
||||||
|
|
||||||
pub fn build(
|
pub fn build(
|
||||||
// name: impl AsRef<str>,
|
// name: impl AsRef<str>,
|
||||||
|
@ -94,37 +91,5 @@ pub fn process(mod_name: impl AsRef<str>, code: impl AsRef<str>) {
|
||||||
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
|
let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
|
||||||
let mut out_file = File::create(out_dir.join(format!("{}.rs", mod_name.as_ref()))).unwrap();
|
let mut out_file = File::create(out_dir.join(format!("{}.rs", mod_name.as_ref()))).unwrap();
|
||||||
let tokens = build(&component);
|
let tokens = build(&component);
|
||||||
write!(out_file, "{}", tokens);
|
write!(out_file, "{}", tokens).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[proc_macro]
|
|
||||||
// pub fn example(_input_tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
||||||
// let helloworld_datamodel: HashMap<String, String> = hashmap! {
|
|
||||||
// "name".into() => "String".into(),
|
|
||||||
// };
|
|
||||||
|
|
||||||
// let helloworld_datainit: HashMap<String, String> = hashmap! {
|
|
||||||
// "name".into() => "\"world\".into()".into(),
|
|
||||||
// };
|
|
||||||
|
|
||||||
// let helloworld_dom = vec![
|
|
||||||
// Rsx::Elem(Elem {
|
|
||||||
// tag: "input".into(),
|
|
||||||
// attrs: hashmap! {
|
|
||||||
// TagLhs::Bind("value".into()) => "name".into(),
|
|
||||||
// },
|
|
||||||
// inner: vec![],
|
|
||||||
// }),
|
|
||||||
// Rsx::Text("Hello, ".into()),
|
|
||||||
// Rsx::Code(Box::new(syn::parse_str::<Expr>("name").unwrap())),
|
|
||||||
// Rsx::Text("!".into()),
|
|
||||||
// ];
|
|
||||||
|
|
||||||
// process(
|
|
||||||
// "HelloWorld",
|
|
||||||
// &helloworld_datamodel,
|
|
||||||
// &helloworld_datainit,
|
|
||||||
// &helloworld_dom,
|
|
||||||
// )
|
|
||||||
// .into()
|
|
||||||
// }
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::hash::{BuildHasher, Hash};
|
||||||
|
|
||||||
use proc_macro2::TokenStream;
|
|
||||||
use symbol::Symbol;
|
use symbol::Symbol;
|
||||||
use syn_serde::{Expr, Syn, Type};
|
use syn_serde::{Expr, Syn, Type};
|
||||||
|
|
||||||
|
@ -8,12 +8,14 @@ pub type Id = Symbol;
|
||||||
|
|
||||||
pub type ModelMap = HashMap<Symbol, (Type, Expr)>;
|
pub type ModelMap = HashMap<Symbol, (Type, Expr)>;
|
||||||
|
|
||||||
pub fn convert_map(map: HashMap<Symbol, (syn::Type, syn::Expr)>) -> ModelMap {
|
pub fn convert_map<T: Hash + Eq, S: BuildHasher>(
|
||||||
|
map: HashMap<T, (syn::Type, syn::Expr), S>,
|
||||||
|
) -> HashMap<T, (Type, Expr)> {
|
||||||
map.into_iter()
|
map.into_iter()
|
||||||
.map(|(name, (ty, expr))| {
|
.map(|(left, (ty, expr))| {
|
||||||
let ty = ty.to_adapter();
|
let ty = ty.to_adapter();
|
||||||
let expr = expr.to_adapter();
|
let expr = expr.to_adapter();
|
||||||
(name, (ty, expr))
|
(left, (ty, expr))
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
@ -47,7 +49,7 @@ impl Clone for TagRhs {
|
||||||
match self {
|
match self {
|
||||||
TagRhs::Code(expr) => {
|
TagRhs::Code(expr) => {
|
||||||
let expr: syn::Expr = Syn::from_adapter(&*expr);
|
let expr: syn::Expr = Syn::from_adapter(&*expr);
|
||||||
TagRhs::Code(expr.clone().to_adapter())
|
TagRhs::Code(expr.to_adapter())
|
||||||
}
|
}
|
||||||
TagRhs::Text(string) => TagRhs::Text(string.clone()),
|
TagRhs::Text(string) => TagRhs::Text(string.clone()),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
// https://github.com/daboross/serde-tuple-vec-map/blob/master/src/lib.rs
|
// https://github.com/daboross/serde-tuple-vec-map/blob/master/src/lib.rs
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::fmt;
|
|
||||||
use std::cmp;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use serde::{de::{Visitor, Deserialize, Deserializer, SeqAccess}, ser::{Serialize, Serializer}};
|
use serde::{
|
||||||
|
de::{Deserialize, Deserializer, SeqAccess, Visitor},
|
||||||
|
ser::{Serialize, Serializer},
|
||||||
|
};
|
||||||
|
|
||||||
struct TupleVecMapVisitor<K, V> {
|
struct TupleVecMapVisitor<K, V> {
|
||||||
marker: PhantomData<HashMap<K, V>>,
|
marker: PhantomData<HashMap<K, V>>,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use bimap::BiHashMap;
|
|
||||||
use petgraph::graphmap::DiGraphMap;
|
use petgraph::graphmap::DiGraphMap;
|
||||||
use petgraph::visit::Dfs;
|
use petgraph::visit::Dfs;
|
||||||
use proc_macro2::{TokenStream, TokenTree};
|
use proc_macro2::{TokenStream, TokenTree};
|
||||||
|
@ -83,8 +82,6 @@ impl Visitor {
|
||||||
|
|
||||||
pub fn load_model(&mut self, model: &ModelMap) {
|
pub fn load_model(&mut self, model: &ModelMap) {
|
||||||
for (key, (ty, init)) in model {
|
for (key, (ty, init)) in model {
|
||||||
let id = Symbol::gensym();
|
|
||||||
// self.model_bimap.insert(id, key.clone());
|
|
||||||
let ty = Syn::from_adapter(&*ty);
|
let ty = Syn::from_adapter(&*ty);
|
||||||
let init = Syn::from_adapter(&*init);
|
let init = Syn::from_adapter(&*init);
|
||||||
self.model.insert(key.clone(), (ty, init));
|
self.model.insert(key.clone(), (ty, init));
|
||||||
|
|
|
@ -8,17 +8,16 @@ use std::collections::HashMap;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
use std::iter::Peekable;
|
use std::iter::Peekable;
|
||||||
|
|
||||||
use quote::ToTokens;
|
|
||||||
use enterprise_compiler::model::{Component, Elem, ModelMap, Rsx};
|
use enterprise_compiler::model::{Component, Elem, ModelMap, Rsx};
|
||||||
use syn_serde::Syn;
|
|
||||||
use proc_macro2::{
|
use proc_macro2::{
|
||||||
token_stream::IntoIter, Delimiter, Group, Ident, Punct, Spacing, TokenStream, TokenTree,
|
token_stream::IntoIter, Delimiter, Group, Ident, Punct, Spacing, TokenStream, TokenTree,
|
||||||
};
|
};
|
||||||
use symbol::Symbol;
|
use symbol::Symbol;
|
||||||
use syn::{
|
use syn::{
|
||||||
parse::{Parse, ParseStream},
|
parse::{Parse, ParseStream},
|
||||||
Error as SynError, Expr, Lit, Result as SynResult, Token, Type,
|
Error as SynError, Expr, Result as SynResult, Token, Type,
|
||||||
};
|
};
|
||||||
|
use syn_serde::Syn;
|
||||||
|
|
||||||
use crate::rsx::{RsxParser, RsxToken};
|
use crate::rsx::{RsxParser, RsxToken};
|
||||||
|
|
||||||
|
@ -35,7 +34,7 @@ enum ParseError {
|
||||||
UnexpectedKeyword,
|
UnexpectedKeyword,
|
||||||
MissingModel,
|
MissingModel,
|
||||||
MissingView,
|
MissingView,
|
||||||
InvalidRsx(TokenTree),
|
// InvalidRsx(TokenTree),
|
||||||
UnmatchedOpenTag(TokenTree),
|
UnmatchedOpenTag(TokenTree),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,7 +304,7 @@ pub fn component(input_tokens: proc_macro::TokenStream) -> proc_macro::TokenStre
|
||||||
// TODO: allow importing and stuff
|
// TODO: allow importing and stuff
|
||||||
let mut output = TokenStream::new();
|
let mut output = TokenStream::new();
|
||||||
for component in visitor {
|
for component in visitor {
|
||||||
println!("- {:#?}", component);
|
// println!("- {:#?}", component);
|
||||||
let component = component.expect("holy shiet");
|
let component = component.expect("holy shiet");
|
||||||
let name = format_ident!("{}", component.name);
|
let name = format_ident!("{}", component.name);
|
||||||
let serialized = serde_json::to_string(&component).expect("fucking json");
|
let serialized = serde_json::to_string(&component).expect("fucking json");
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::iter::FromIterator;
|
||||||
use std::iter::Peekable;
|
use std::iter::Peekable;
|
||||||
|
|
||||||
use enterprise_compiler::model::{TagLhs, TagRhs};
|
use enterprise_compiler::model::{TagLhs, TagRhs};
|
||||||
use proc_macro2::{token_stream::IntoIter, Delimiter, Ident, Spacing, TokenStream, TokenTree};
|
use proc_macro2::{token_stream::IntoIter, Delimiter, Ident, TokenStream, TokenTree};
|
||||||
use symbol::Symbol;
|
use symbol::Symbol;
|
||||||
use syn::{Expr, Lit};
|
use syn::{Expr, Lit};
|
||||||
use syn_serde::Syn;
|
use syn_serde::Syn;
|
||||||
|
@ -106,12 +106,12 @@ impl RsxParser {
|
||||||
} else {
|
} else {
|
||||||
unimplemented!("these are wrong states")
|
unimplemented!("these are wrong states")
|
||||||
};
|
};
|
||||||
consume_punct(&mut iter, Some('='));
|
consume_punct(&mut iter, Some('='))?;
|
||||||
|
|
||||||
let next_token = iter.next();
|
let next_token = iter.next();
|
||||||
let rhs = match next_token {
|
let rhs = match next_token {
|
||||||
Some(TokenTree::Literal(lit)) => {
|
Some(TokenTree::Literal(lit)) => {
|
||||||
let mut stream = TokenStream::from(TokenTree::Literal(lit));
|
let stream = TokenStream::from(TokenTree::Literal(lit));
|
||||||
let lit = syn::parse2::<Lit>(stream)?;
|
let lit = syn::parse2::<Lit>(stream)?;
|
||||||
if let Lit::Str(string) = lit {
|
if let Lit::Str(string) = lit {
|
||||||
TagRhs::Text(string.value())
|
TagRhs::Text(string.value())
|
||||||
|
@ -137,7 +137,7 @@ impl RsxParser {
|
||||||
return Ok(Some(variant(Symbol::from(name.to_string()), attrs)));
|
return Ok(Some(variant(Symbol::from(name.to_string()), attrs)));
|
||||||
}
|
}
|
||||||
TokenTree::Literal(lit) => {
|
TokenTree::Literal(lit) => {
|
||||||
let mut stream = TokenStream::from(TokenTree::Literal(lit));
|
let stream = TokenStream::from(TokenTree::Literal(lit));
|
||||||
let lit = syn::parse2::<Lit>(stream)?;
|
let lit = syn::parse2::<Lit>(stream)?;
|
||||||
|
|
||||||
if let Lit::Str(string) = lit {
|
if let Lit::Str(string) = lit {
|
||||||
|
|
9
examples/todomvc/Cargo.toml
Normal file
9
examples/todomvc/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "todomvc"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Michael Zhang <iptq@protonmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
3
examples/todomvc/src/main.rs
Normal file
3
examples/todomvc/src/main.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
|
@ -1,8 +1,5 @@
|
||||||
// cribbed from https://github.com/remexre/symbol-rs
|
// cribbed from https://github.com/remexre/symbol-rs
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
extern crate serde_derive;
|
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::fmt::{self, Debug, Display, Formatter, Result as FmtResult};
|
use std::fmt::{self, Debug, Display, Formatter, Result as FmtResult};
|
||||||
|
|
Loading…
Reference in a new issue