apache_echarts_wrapper/
lib.rs

1pub mod options;
2mod builder;
3pub mod templates;
4pub mod common;
5
6pub use builder::{
7    ChartBuilder,
8    RegressionChartBuilder,
9};
10
11#[cfg(test)]
12mod tests {
13    use crate::builder::{ChartBuilder, RegressionChartBuilder};
14    use crate::options::{EChartsOption, SeriesType};
15    use crate::templates::OnePage;
16    use sailfish::TemplateSimple;
17    use std::net::TcpListener;
18    use std::thread;
19    use std::time::Duration;
20    use tiny_http::{Header, Server};
21    use crate::common::Size;
22
23    #[test]
24    fn it_works() {
25        let chart = EChartsOption::<f64, &str>::new()
26            .title_str("Something interesting")
27            .add_series(
28                SeriesType::Line,
29                "fist_set",
30                vec![(12.5,"First"),(14.0,"Second"),(15.0,"Third"),(10.0,"Fourth")]
31            )
32            .add_series(
33                SeriesType::Line,
34                "second_set",
35                vec![(2.0,"First"),(14.0,"Third"),(15.0,"Third"),(20.0,"First")]
36            )
37            .build(Size::pixels(600),Size::pixels(400));
38
39        let numeric_chart = EChartsOption::<f64, f64>::new()
40            .title_str("Something completely different")
41            .add_linear_regression_series(
42                "regression set2",
43                vec![
44                    (1.0,1.0),
45                    (1.0,2.0),
46                    (3.5,3.0),
47                    (4.0,4.0),
48                    (4.1,1.0),
49                    (4.1,3.0),
50                    (5.0,4.0),
51                    (14.0,3.0),
52                    (15.0,1.0),
53                    (20.0,1.0)
54                ]
55            )
56            .add_linear_regression_series(
57                "regression set",
58                vec![
59                    (1.0,11.0),
60                    (1.0,20.0),
61                    (3.5,30.0),
62                    (4.0,40.0),
63                    (4.1,11.0),
64                    (4.1,35.0),
65                    (5.0,40.0),
66                    (14.0,33.0),
67                    (15.0,31.0),
68                    (20.0,11.0)
69                ]
70            ) .build(Size::pixels(600),Size::pixels(400));
71
72        let mut body = chart.render_once().unwrap();
73        body.push_str(numeric_chart.render_once().unwrap().as_str());
74        // Generate your HTML string here
75        let html = OnePage::new("Test",body.as_str()).render_once().unwrap();
76
77        // Start a minimal web server in a separate thread
78        let listener = TcpListener::bind("127.0.0.1:0").unwrap(); // Bind to any free port
79        let addr = listener.local_addr().unwrap();
80        let server = Server::from_listener(listener,None).unwrap();
81
82        // Optionally open in a browser
83        let url = format!("http://{}", addr);
84        println!("Serving at {}", url);
85        let _ = open::that(&url); // Just ignore errors here
86
87        thread::spawn(move || {
88            for request in server.incoming_requests() {
89                let response = tiny_http::Response::from_string(html.clone())
90                    .with_header("Content-Type: text/html".parse::<Header>().unwrap());
91                let _ = request.respond(response);
92            }
93        });
94
95        // Keep the test alive a bit so you can view it
96        thread::sleep(Duration::from_secs(5));
97    }
98}