Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter_parser.rs

1use super::until::{Color, Map, must_translate};
2use crate::{translate, translate_enum};
3use anyhow::Result;
4use plotly::Scatter;
5
6pub fn parse_scatter_data(
7    sc_obj: &mut serde_json::Value,
8    map: &Map,
9) -> Result<Box<Scatter<f64, f64>>> {
10    let x: Vec<f64> = must_translate(sc_obj, map, "x")?;
11    let y: Vec<f64> = must_translate(sc_obj, map, "y")?;
12    let sc = Scatter::new(x, y);
13    let sc = translate! {
14        sc,
15        sc_obj,
16        map,
17        (web_gl_mode, bool),
18        (x0, f64),
19        (dx, f64),
20        (y0, f64),
21        (dy, f64),
22        (ids, Vec<String>),
23        (text, String),
24        (text_array, Vec<String>),
25        (text_template, String),
26        (hover_template, String),
27        (hover_template_array, Vec<String>),
28        (hover_text, String),
29        (hover_text_array, Vec<String>),
30        (name, String),
31        (opacity, f64),
32        (meta, String),
33        (x_axis, String),
34        (y_axis, String),
35        (stack_group, String),
36        (clip_on_axis, bool),
37        (connect_gaps, bool),
38        (fill_color, Color),
39        (show_legend, bool),
40        (legend_group, String),
41    }?;
42
43    use plotly::common::Fill;
44    use plotly::common::Mode;
45    let sc = translate_enum! {
46        sc,
47        sc_obj,
48        map,
49        (fill, {
50            "tozeroy" => Fill::ToZeroY,
51            "tozerox" => Fill::ToZeroX,
52            "tonexty" => Fill::ToNextY,
53            "tonextx" => Fill::ToNextX,
54            "toself" =>  Fill::ToSelf,
55            "tonext" =>  Fill::ToNext,
56            "none" =>    Fill::None,
57        }),
58        (mode, {
59            "lines" =>          Mode::Lines,
60            "markers" =>        Mode::Markers,
61            "text" =>           Mode::Text,
62            "linesmarkers" =>   Mode::LinesMarkers,
63            "linestext" =>      Mode::LinesText,
64            "markerstext" =>    Mode::MarkersText,
65            "linemarkerstext" =>Mode::LinesMarkersText,
66            "none" =>           Mode::None,
67        }),
68    }?;
69
70    let sc = if let Some(marker_obj) = sc_obj.get_mut("marker")
71        && marker_obj.is_object()
72    {
73        let marker = plotly::common::Marker::new();
74        let marker = translate! {
75            marker,
76            marker_obj,
77            map,
78            (color, Color),
79            (opacity, f64),
80            (size, usize),
81            (size_array, Vec<usize>),
82            (max_displayed, usize),
83            (size_ref, usize),
84            (size_min, usize),
85            (cauto, bool),
86            (cmax, f64),
87            (cmin, f64),
88            (cmid, f64),
89            (auto_color_scale, bool),
90            (reverse_scale, bool),
91            (show_scale, bool),
92            (outlier_color, Color)
93        }?;
94
95        use plotly::common::{MarkerSymbol, SizeMode};
96        let marker = translate_enum! {
97            marker,
98            marker_obj,
99            map,
100            (symbol, {
101                "circle" =>         MarkerSymbol::Circle,
102                "square" =>         MarkerSymbol::Square,
103                "diamond" =>        MarkerSymbol::Diamond,
104                "cross" =>          MarkerSymbol::Cross,
105                "x" =>              MarkerSymbol::X,
106                "triangle-up" =>    MarkerSymbol::TriangleUp,
107                "triangle-down" =>  MarkerSymbol::TriangleDown,
108                "triangle-left" =>  MarkerSymbol::TriangleLeft,
109                "triangle-right" => MarkerSymbol::TriangleRight,
110                "pentagon" =>       MarkerSymbol::Pentagon,
111                "hexagon" =>        MarkerSymbol::Hexagon,
112            }),
113            (size_mode, {
114                "area" => SizeMode::Area,
115                "diameter" => SizeMode::Diameter,
116            }),
117        }?;
118        sc.marker(marker)
119    } else {
120        sc
121    };
122
123    Ok(sc)
124}