Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter_mapbox_parser.rs

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