Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter_geo_parser.rs

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