From ec2beec5c585b776fe0f31b33fc0493e52c53061 Mon Sep 17 00:00:00 2001 From: Jovansonlee Cesar Date: Sat, 29 Feb 2020 01:25:05 +0800 Subject: Make functions that return Node<()> into a return generics Node to allow usage of Node generics in sauron apps --- Cargo.lock | 223 ++++++++++++++++++++- svgbob/Cargo.toml | 2 +- svgbob/src/buffer/cell_buffer.rs | 34 ++-- svgbob/src/buffer/fragment_buffer/fragment.rs | 4 +- svgbob/src/buffer/fragment_buffer/fragment/arc.rs | 4 +- .../src/buffer/fragment_buffer/fragment/circle.rs | 4 +- svgbob/src/buffer/fragment_buffer/fragment/line.rs | 4 +- .../buffer/fragment_buffer/fragment/marker_line.rs | 6 +- .../src/buffer/fragment_buffer/fragment/polygon.rs | 4 +- svgbob/src/buffer/fragment_buffer/fragment/rect.rs | 4 +- svgbob/src/buffer/fragment_buffer/fragment/text.rs | 11 +- svgbob/src/buffer/fragment_buffer/fragment_tree.rs | 6 +- svgbob/src/lib.rs | 6 +- 13 files changed, 268 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 25f0fc1..5a55d57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,6 +21,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anyhow" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" + [[package]] name = "approx" version = "0.3.2" @@ -59,6 +65,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bumpalo" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" + [[package]] name = "cfg-if" version = "0.1.10" @@ -122,6 +134,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "heck" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.1.6" @@ -140,6 +161,15 @@ dependencies = [ "either", ] +[[package]] +name = "js-sys" +version = "0.3.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -182,6 +212,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + [[package]] name = "nalgebra" version = "0.18.1" @@ -218,6 +254,16 @@ dependencies = [ "smallvec", ] +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "num-complex" version = "0.2.4" @@ -280,6 +326,24 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5cf7f52c12da93c26b63ee0d9f012bc82fb071851c546c030dc6ecb5f2994b" +[[package]] +name = "proc-macro2" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rand" version = "0.6.5" @@ -403,21 +467,25 @@ dependencies = [ [[package]] name = "sauron" -version = "0.21.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee92eb275e1c4dd3d2f314cf162d67f9db7916436a59aebf93715c40d6818c16" +checksum = "987022bf1b21c2d5d5cbd02af2af0a9c78b954b1e8b493e177250e43e5f6f28a" dependencies = [ "cfg-if", + "js-sys", "lazy_static", "log", "sauron_vdom", + "thiserror", + "wasm-bindgen", + "web-sys", ] [[package]] name = "sauron_vdom" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9de12db6e3f973366706550ff4a3a2a3396d5dd4398ec666dd8d3552eb5ebe" +checksum = "f60ed6fcda6e9822203da7ecf0c04d14e6e85475992ada0589e0ad357e3f3179" dependencies = [ "log", ] @@ -437,6 +505,12 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "sourcefile" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" + [[package]] name = "strsim" version = "0.8.0" @@ -464,6 +538,17 @@ dependencies = [ "svgbob", ] +[[package]] +name = "syn" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -473,24 +558,154 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee14bf8e6767ab4c687c9e8bc003879e042a96fd67a3ba5934eadb6536bef4db" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "typenum" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +[[package]] +name = "unicode-segmentation" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" + [[package]] name = "unicode-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + [[package]] name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + +[[package]] +name = "wasm-bindgen" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" + +[[package]] +name = "wasm-bindgen-webidl" +version = "0.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" +dependencies = [ + "anyhow", + "heck", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "weedle", +] + +[[package]] +name = "web-sys" +version = "0.3.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" +dependencies = [ + "anyhow", + "js-sys", + "sourcefile", + "wasm-bindgen", + "wasm-bindgen-webidl", +] + +[[package]] +name = "weedle" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" +dependencies = [ + "nom", +] + [[package]] name = "winapi" version = "0.3.8" diff --git a/svgbob/Cargo.toml b/svgbob/Cargo.toml index 287b509..b110a82 100644 --- a/svgbob/Cargo.toml +++ b/svgbob/Cargo.toml @@ -13,7 +13,7 @@ license = "Apache-2.0" nalgebra = "0.18.0" ncollide2d = "0.19.1" lazy_static = "1.3.0" -sauron = { version = "0.21.0", default-features = false} +sauron = { version = "0.22.0", default-features = false, features = ["with-dom"]} unicode-width = "0.1.5" itertools = "0.8.0" pom = { version = "3.1.0" } diff --git a/svgbob/src/buffer/cell_buffer.rs b/svgbob/src/buffer/cell_buffer.rs index c2f9239..d4cda46 100644 --- a/svgbob/src/buffer/cell_buffer.rs +++ b/svgbob/src/buffer/cell_buffer.rs @@ -131,7 +131,7 @@ impl CellBuffer { } /// get the svg node of this cell buffer, using the default settings for the sizes - pub fn get_node(&self) -> Node<()> { + pub fn get_node(&self) -> Node { let (node, _w, _h) = self.get_node_with_size(&Settings::default()); node } @@ -146,7 +146,7 @@ impl CellBuffer { } /// get all nodes of this cell buffer - pub fn get_node_with_size(&self, settings: &Settings) -> (Node<()>, f32, f32) { + pub fn get_node_with_size(&self, settings: &Settings) -> (Node, f32, f32) { let (w, h) = self.get_size(&settings); // vec_fragments are the fragment result of successful endorsement // @@ -170,14 +170,18 @@ impl CellBuffer { .flat_map(|contact| contact.0) .collect(); - let group_nodes: Vec> = vec_groups + let group_nodes: Vec> = vec_groups .into_iter() .map(|contact| contact.0) .map(move |contacts| { let mut group_members = contacts .iter() - .map(move |gfrag| gfrag.scale(settings.scale).into()) - .collect::>(); + .map(move |gfrag| { + let scaled = gfrag.scale(settings.scale); + let node: Node = scaled.into(); + node + }) + .collect::>>(); g(vec![], group_members) }) .collect(); @@ -199,7 +203,7 @@ impl CellBuffer { classes.join("\n") } - fn get_style(settings: &Settings, legend_css: String) -> Node<()> { + fn get_style(settings: &Settings, legend_css: String) -> Node { html::tags::style( vec![], vec![text(format!( @@ -287,18 +291,18 @@ impl CellBuffer { /// convert the fragments into svg nodes using the supplied settings, with size for the /// dimension - pub(crate) fn fragments_to_node( + pub(crate) fn fragments_to_node( fragments: Vec, legend_css: String, settings: &Settings, w: f32, h: f32, - ) -> Node<()> { + ) -> Node { let fragments_scaled: Vec = fragments .into_iter() .map(|frag| frag.scale(settings.scale)) .collect(); - let fragment_nodes: Vec> = FragmentTree::fragments_to_node(fragments_scaled); + let fragment_nodes: Vec> = FragmentTree::fragments_to_node(fragments_scaled); let svg_node = svg( vec![xmlns("http://www.w3.org/2000/svg"), width(w), height(h)], @@ -315,7 +319,7 @@ impl CellBuffer { svg_node } - fn get_defs() -> Node<()> { + fn get_defs() -> Node { defs( vec![], vec![ @@ -328,7 +332,7 @@ impl CellBuffer { ) } - fn arrow_marker() -> Node<()> { + fn arrow_marker() -> Node { marker( vec![ id("arrow"), @@ -343,7 +347,7 @@ impl CellBuffer { ) } - fn diamond_marker() -> Node<()> { + fn diamond_marker() -> Node { marker( vec![ id("diamond"), @@ -358,7 +362,7 @@ impl CellBuffer { ) } - fn open_circle_marker() -> Node<()> { + fn open_circle_marker() -> Node { marker( vec![ id("open_circle"), @@ -376,7 +380,7 @@ impl CellBuffer { ) } - fn circle_marker() -> Node<()> { + fn circle_marker() -> Node { marker( vec![ id("circle"), @@ -394,7 +398,7 @@ impl CellBuffer { ) } - fn big_open_circle_marker() -> Node<()> { + fn big_open_circle_marker() -> Node { marker( vec![ id("big_open_circle"), diff --git a/svgbob/src/buffer/fragment_buffer/fragment.rs b/svgbob/src/buffer/fragment_buffer/fragment.rs index a968e1e..3329315 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment.rs @@ -450,8 +450,8 @@ impl Bounds for Fragment { } } -impl Into> for Fragment { - fn into(self) -> Node<()> { +impl Into> for Fragment { + fn into(self) -> Node { match self { Fragment::Line(line) => line.into(), Fragment::MarkerLine(marker_line) => marker_line.into(), diff --git a/svgbob/src/buffer/fragment_buffer/fragment/arc.rs b/svgbob/src/buffer/fragment_buffer/fragment/arc.rs index d37a1c5..12a477e 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/arc.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/arc.rs @@ -156,8 +156,8 @@ impl fmt::Display for Arc { } } -impl Into> for Arc { - fn into(self) -> Node<()> { +impl Into> for Arc { + fn into(self) -> Node { let dv = format!( "M {},{} A {},{} {},{},{} {},{}", self.start.x, diff --git a/svgbob/src/buffer/fragment_buffer/fragment/circle.rs b/svgbob/src/buffer/fragment_buffer/fragment/circle.rs index 585de64..03a7e65 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/circle.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/circle.rs @@ -61,8 +61,8 @@ impl fmt::Display for Circle { } } -impl Into> for Circle { - fn into(self) -> Node<()> { +impl Into> for Circle { + fn into(self) -> Node { circle( vec![ cx(self.center.x), diff --git a/svgbob/src/buffer/fragment_buffer/fragment/line.rs b/svgbob/src/buffer/fragment_buffer/fragment/line.rs index a69b5d4..f51eb27 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/line.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/line.rs @@ -558,8 +558,8 @@ impl fmt::Display for Line { } } -impl Into> for Line { - fn into(self) -> Node<()> { +impl Into> for Line { + fn into(self) -> Node { svg::tags::line( vec![ x1(self.start.x), diff --git a/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs b/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs index 7e57490..423612f 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs @@ -175,9 +175,9 @@ impl fmt::Display for MarkerLine { } } -impl Into> for MarkerLine { - fn into(self) -> Node<()> { - let mut node: Node<()> = self.line.into(); +impl Into> for MarkerLine { + fn into(self) -> Node { + let mut node: Node = self.line.into(); let mut classes = vec![]; if let Some(start_marker) = self.start_marker { classes.push(class(format!("start_marked_{}", start_marker))); diff --git a/svgbob/src/buffer/fragment_buffer/fragment/polygon.rs b/svgbob/src/buffer/fragment_buffer/fragment/polygon.rs index b1a9239..ce82ae4 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/polygon.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/polygon.rs @@ -159,8 +159,8 @@ impl fmt::Display for Polygon { } } -impl Into> for Polygon { - fn into(self) -> Node<()> { +impl Into> for Polygon { + fn into(self) -> Node { polygon( vec![ points( diff --git a/svgbob/src/buffer/fragment_buffer/fragment/rect.rs b/svgbob/src/buffer/fragment_buffer/fragment/rect.rs index d716dc7..97a15e0 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/rect.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/rect.rs @@ -107,8 +107,8 @@ impl fmt::Display for Rect { } } -impl Into> for Rect { - fn into(self) -> Node<()> { +impl Into> for Rect { + fn into(self) -> Node { rect( vec![ x(self.start.x), diff --git a/svgbob/src/buffer/fragment_buffer/fragment/text.rs b/svgbob/src/buffer/fragment_buffer/fragment/text.rs index b5ce261..039e6d7 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment/text.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment/text.rs @@ -95,8 +95,8 @@ impl Into for CellText { } } -impl Into> for CellText { - fn into(self) -> Node<()> { +impl Into> for CellText { + fn into(self) -> Node { let text: Text = self.into(); text.into() } @@ -162,11 +162,14 @@ impl fmt::Display for Text { } } -impl Into> for Text { - fn into(self) -> Node<()> { +impl Into> for Text { + fn into(self) -> Node { svg::tags::text( vec![x(self.start.x), y(self.start.y)], + #[cfg(not(feature = "with-dom"))] vec![text(escape_html_text(&self.text))], + #[cfg(feature = "with-dom")] + vec![text(&self.text)], ) } } diff --git a/svgbob/src/buffer/fragment_buffer/fragment_tree.rs b/svgbob/src/buffer/fragment_buffer/fragment_tree.rs index 863dfad..e3f476b 100644 --- a/svgbob/src/buffer/fragment_buffer/fragment_tree.rs +++ b/svgbob/src/buffer/fragment_buffer/fragment_tree.rs @@ -99,9 +99,9 @@ impl FragmentTree { } /// convert back into fragments - fn into_nodes(self) -> Vec> { + fn into_nodes(self) -> Vec> { let mut nodes = vec![]; - let mut fragment_node: Node<()> = self.fragment.into(); + let mut fragment_node: Node = self.fragment.into(); fragment_node = fragment_node.add_attributes(vec![classes(self.css_tag)]); nodes.push(fragment_node); for child in self.enclosing { @@ -112,7 +112,7 @@ impl FragmentTree { /// convert fragments to node, where cell_text and text may become /// css class of the contain fragment - pub(crate) fn fragments_to_node(fragments: Vec) -> Vec> { + pub(crate) fn fragments_to_node(fragments: Vec) -> Vec> { let fragment_trees: Vec = Self::enclose_fragments(fragments); fragment_trees .into_iter() diff --git a/svgbob/src/lib.rs b/svgbob/src/lib.rs index 1d9e836..dff232c 100644 --- a/svgbob/src/lib.rs +++ b/svgbob/src/lib.rs @@ -13,16 +13,18 @@ pub use buffer::{ Signal, }; pub use point::Point; +use sauron::Node; /// convert svgbob ascii art to svg pub fn to_svg(ascii: &str) -> String { let cb = CellBuffer::from(ascii); - cb.get_node().to_string() + let node: Node<()> = cb.get_node(); + node.to_string() } /// convert ascii art into an svg pub fn to_svg_with_settings(ascii: &str, settings: &Settings) -> String { let cb = CellBuffer::from(ascii); - let (node, _w, _h) = cb.get_node_with_size(settings); + let (node, _w, _h): (Node<()>, f32, f32) = cb.get_node_with_size(settings); node.to_string() } -- cgit v1.2.3