make a separate crate
This commit is contained in:
parent
46be78e007
commit
cdb7a9b8e3
10 changed files with 96 additions and 68 deletions
8
.gitignore
vendored
8
.gitignore
vendored
|
@ -1,10 +1,2 @@
|
||||||
/target
|
/target
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
|
|
||||||
|
|
||||||
#Added by cargo
|
|
||||||
#
|
|
||||||
#already existing elements are commented out
|
|
||||||
|
|
||||||
#/target
|
|
||||||
#**/*.rs.bk
|
|
||||||
|
|
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -74,6 +74,14 @@ name = "fixedbitset"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "helloworld"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"enterprise 0.1.0",
|
||||||
|
"stdweb 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "1.3.1"
|
version = "1.3.1"
|
||||||
|
|
|
@ -7,6 +7,7 @@ edition = "2018"
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"enterprise-compiler",
|
"enterprise-compiler",
|
||||||
|
"examples/helloworld",
|
||||||
]
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
|
@ -38,12 +38,12 @@ fn process(
|
||||||
let name = format_ident!("{}", name);
|
let name = format_ident!("{}", name);
|
||||||
// TODO: parse this into an actual expression tree for Vec<T>
|
// TODO: parse this into an actual expression tree for Vec<T>
|
||||||
let ty = format_ident!("{}", ty);
|
let ty = format_ident!("{}", ty);
|
||||||
model.extend(quote! { #name : Arc<Mutex<#ty>> , });
|
model.extend(quote! { #name : Arc<enterprise::parking_lot::Mutex<#ty>> , });
|
||||||
}
|
}
|
||||||
for (name, value) in datainit {
|
for (name, value) in datainit {
|
||||||
let name = format_ident!("{}", name);
|
let name = format_ident!("{}", name);
|
||||||
let value = syn::parse_str::<Expr>(&value).unwrap();
|
let value = syn::parse_str::<Expr>(&value).unwrap();
|
||||||
init.extend(quote! { #name : Arc::new(Mutex::new(#value)) , });
|
init.extend(quote! { #name : Arc::new(enterprise::parking_lot::Mutex::new(#value)) , });
|
||||||
}
|
}
|
||||||
|
|
||||||
let impl_code = &visitor.impl_code;
|
let impl_code = &visitor.impl_code;
|
||||||
|
@ -51,8 +51,11 @@ fn process(
|
||||||
for fn_name in toplevel_names.iter() {
|
for fn_name in toplevel_names.iter() {
|
||||||
let fn_name = format_ident!("{}", fn_name);
|
let fn_name = format_ident!("{}", fn_name);
|
||||||
init_el_code.extend(quote! {
|
init_el_code.extend(quote! {
|
||||||
|
{
|
||||||
|
use enterprise::stdweb::web::INode;
|
||||||
let sub = self.#fn_name();
|
let sub = self.#fn_name();
|
||||||
el.append_child(&sub);
|
el.append_child(&sub);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +77,7 @@ fn process(
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: Backend> crate::Component<B> for #name<B> {
|
impl<B: Backend> crate::Component<B> for #name<B> {
|
||||||
fn initialize(&self, el: &crate::Element) {
|
fn initialize(&self, el: &enterprise::stdweb::web::Element) {
|
||||||
#init_el_code
|
#init_el_code
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,8 @@ impl Visitor {
|
||||||
let id_str = id.as_str();
|
let id_str = id.as_str();
|
||||||
update_func.extend(quote! {
|
update_func.extend(quote! {
|
||||||
{
|
{
|
||||||
if let Some(target) = document().get_element_by_id(#id_str) {
|
use enterprise::stdweb::web::{INonElementParentNode, INode};
|
||||||
|
if let Some(target) = enterprise::stdweb::web::document().get_element_by_id(#id_str) {
|
||||||
target.set_text_content(&new_value.clone());
|
target.set_text_content(&new_value.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,17 +200,21 @@ impl Visitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updates.extend(quote! {
|
updates.extend(quote! {
|
||||||
|
{
|
||||||
|
use enterprise::stdweb::{web::IEventTarget, unstable::TryFrom};
|
||||||
let inner_el = el.clone();
|
let inner_el = el.clone();
|
||||||
el.add_event_listener(move |evt: stdweb::web::event::InputEvent| {
|
el.add_event_listener(move |evt: stdweb::web::event::InputEvent| {
|
||||||
let new_value = InputElement::try_from(inner_el.clone()).unwrap().raw_value();
|
let new_value = enterprise::stdweb::web::html_element::InputElement::try_from(inner_el.clone()).unwrap().raw_value();
|
||||||
#update_func
|
#update_func
|
||||||
});
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.impl_code.extend(quote! {
|
self.impl_code.extend(quote! {
|
||||||
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
||||||
let el = document().create_element(#tag).unwrap();
|
use enterprise::stdweb::web::IElement;
|
||||||
|
let el = enterprise::stdweb::web::document().create_element(#tag).unwrap();
|
||||||
el.set_attribute("id", #node_str).unwrap();
|
el.set_attribute("id", #node_str).unwrap();
|
||||||
#updates
|
#updates
|
||||||
el
|
el
|
||||||
|
@ -221,7 +226,8 @@ impl Visitor {
|
||||||
self.impl_code.extend(quote! {
|
self.impl_code.extend(quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
||||||
let el = document().create_element("span").expect("shouldn't fail");
|
use enterprise::stdweb::web::IElement;
|
||||||
|
let el = enterprise::stdweb::web::document().create_element("span").expect("shouldn't fail");
|
||||||
el.set_attribute("id", #node_str).unwrap();
|
el.set_attribute("id", #node_str).unwrap();
|
||||||
el
|
el
|
||||||
}
|
}
|
||||||
|
@ -231,7 +237,7 @@ impl Visitor {
|
||||||
self.impl_code.extend(quote! {
|
self.impl_code.extend(quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
fn #make_node_id(&self) -> impl stdweb::web::INode {
|
||||||
document().create_text_node(#literal)
|
enterprise::stdweb::web::document().create_text_node(#literal)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
2
examples/helloworld/.gitignore
vendored
Normal file
2
examples/helloworld/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/target
|
||||||
|
**/*.rs.bk
|
9
examples/helloworld/Cargo.toml
Normal file
9
examples/helloworld/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "helloworld"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Michael Zhang <iptq@protonmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
stdweb = "0.4.20"
|
||||||
|
enterprise = { path = "../.." }
|
29
examples/helloworld/src/main.rs
Normal file
29
examples/helloworld/src/main.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#[macro_use]
|
||||||
|
extern crate enterprise;
|
||||||
|
|
||||||
|
// #[macro_use]
|
||||||
|
extern crate stdweb;
|
||||||
|
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use enterprise::{Backend, Component, Web};
|
||||||
|
|
||||||
|
// use stdweb::{
|
||||||
|
// unstable::TryFrom,
|
||||||
|
// web::{
|
||||||
|
// document, html_element::InputElement, Element, IElement, IEventTarget, INode,
|
||||||
|
// INonElementParentNode,
|
||||||
|
// },
|
||||||
|
// };
|
||||||
|
|
||||||
|
example!();
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
stdweb::initialize();
|
||||||
|
|
||||||
|
let web = Web;
|
||||||
|
let app = HelloWorld::new(&web);
|
||||||
|
enterprise::render(&app, "app");
|
||||||
|
|
||||||
|
stdweb::event_loop();
|
||||||
|
}
|
24
src/lib.rs
Normal file
24
src/lib.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
extern crate enterprise_compiler;
|
||||||
|
|
||||||
|
// re-exports
|
||||||
|
pub extern crate parking_lot;
|
||||||
|
pub extern crate stdweb;
|
||||||
|
|
||||||
|
mod backend;
|
||||||
|
|
||||||
|
pub use enterprise_compiler::example;
|
||||||
|
use stdweb::web::{document, Element, INonElementParentNode};
|
||||||
|
|
||||||
|
pub use crate::backend::{Backend, Web};
|
||||||
|
|
||||||
|
pub trait Component<B: Backend> {
|
||||||
|
fn initialize(&self, element: &Element);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render<B: Backend, C: Component<B>>(component: &C, id: impl AsRef<str>) {
|
||||||
|
let id = id.as_ref();
|
||||||
|
if let Some(el) = document().get_element_by_id(id) {
|
||||||
|
println!("Rendering...");
|
||||||
|
component.initialize(&el);
|
||||||
|
}
|
||||||
|
}
|
46
src/main.rs
46
src/main.rs
|
@ -1,46 +0,0 @@
|
||||||
#[macro_use]
|
|
||||||
extern crate enterprise_compiler;
|
|
||||||
#[macro_use]
|
|
||||||
extern crate stdweb;
|
|
||||||
|
|
||||||
mod backend;
|
|
||||||
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use parking_lot::Mutex;
|
|
||||||
use stdweb::{
|
|
||||||
unstable::TryFrom,
|
|
||||||
web::{
|
|
||||||
document, html_element::InputElement, Element, IElement, IEventTarget, INode,
|
|
||||||
INonElementParentNode,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::backend::{Backend, Web};
|
|
||||||
|
|
||||||
trait Component<B: Backend> {
|
|
||||||
fn initialize(&self, element: &Element);
|
|
||||||
}
|
|
||||||
|
|
||||||
example!();
|
|
||||||
|
|
||||||
fn render<B: Backend, C: Component<B>>(component: &C, id: impl AsRef<str>) {
|
|
||||||
let id = id.as_ref();
|
|
||||||
if let Some(el) = document().get_element_by_id(id) {
|
|
||||||
println!("Rendering...");
|
|
||||||
component.initialize(&el);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
stdweb::initialize();
|
|
||||||
|
|
||||||
let web = Web;
|
|
||||||
let app = HelloWorld::new(&web);
|
|
||||||
render(&app, "app");
|
|
||||||
|
|
||||||
let message = "Hello world!";
|
|
||||||
js! { console.log(@{message}); }
|
|
||||||
|
|
||||||
stdweb::event_loop();
|
|
||||||
}
|
|
Loading…
Reference in a new issue