1#[cfg_attr(feature = "serde", macro_use)]
2#[cfg(feature = "serde")]
3extern crate serde;
4
5pub mod error;
6pub mod prelude;
7pub mod svg;
8pub mod types;
9
10use std::path::Path;
11
12use log::debug;
13use prelude::*;
14use taffy::prelude::Number as SprawlNumber;
15use taffy::prelude::Size as SprawlSize;
16use taffy::prelude::Style as SprawlStyle;
17use taffy::Taffy;
18
19pub fn compute_svg_string(
20 root: FlexNode,
21 base_path: Option<&Path>,
22) -> Result<String, Error> {
23 debug!("root: {:#?}", root);
24 let layout_root = compute_layout_root(root)?;
25 crate::svg::compute_svg_string(layout_root, base_path)
26}
27
28fn compute_layout_root(node: FlexNode) -> Result<FlexGeomNode, Error> {
29 let size = SprawlSize {
30 height: SprawlNumber::Defined(100.0),
31 width: SprawlNumber::Defined(100.0),
32 };
33 let mut taffy = Taffy::new();
34 let stacked_sprawl_root =
35 compute_stacked_sprawl_recursive(node, &mut taffy)?;
36 taffy.compute_layout(stacked_sprawl_root.taffy_node, size)?;
37 let root = compute_layout_root_recursive(stacked_sprawl_root, &mut taffy)?;
38 Ok(root)
39}
40
41fn compute_layout_root_recursive(
42 parent: FlexTaffyNode,
43 taffy: &mut Taffy,
44) -> Result<FlexGeomNode, Error> {
45 let mut children_nodes = vec![];
46 for child in parent.nodes {
47 let layout_node = compute_layout_root_recursive(child, taffy)?;
48 children_nodes.push(layout_node);
49 }
50 let sprawl_layout = taffy.layout(parent.taffy_node)?;
51
52 Ok(FlexGeomNode {
53 element: parent.element,
54 position: FlexPoint {
55 x: sprawl_layout.location.x,
56 y: sprawl_layout.location.y,
57 },
58 width: sprawl_layout.size.width,
59 height: sprawl_layout.size.height,
60 root: parent.root,
61 nodes: children_nodes,
62 })
63}
64
65fn compute_stacked_sprawl_recursive(
66 parent: FlexNode,
67 taffy: &mut Taffy,
68) -> Result<FlexTaffyNode, Error> {
69 let child_len = parent.nodes.len();
70 let mut stacked_sprawl_children = Vec::with_capacity(child_len);
71 let mut sprawl_children = Vec::with_capacity(child_len);
72
73 for child in parent.nodes {
74 let child = compute_stacked_sprawl_recursive(child, taffy)?;
75 sprawl_children.push(child.taffy_node);
76 stacked_sprawl_children.push(child);
77 }
78 let sprawl_node =
79 taffy.new_node(SprawlStyle::from(parent.layout), &sprawl_children)?;
80 debug!("{:?}, {:?}", &sprawl_node, sprawl_children);
81 Ok(FlexTaffyNode {
82 taffy_node: sprawl_node,
83 element: parent.element,
84 root: parent.root,
85 nodes: stacked_sprawl_children,
86 })
87}
88
89#[cfg(test)]
90mod tests {
91
92 use std::sync::Once;
93
94 static INIT: Once = Once::new();
97
98 pub fn initialize() {
99 INIT.call_once(|| {
100 env_logger::init();
101 });
102 }
103
104 #[test]
105 fn simple_diagram_0() {
106 initialize();
107 }
116}