mdbook_plotly/code_handler/plot_obj_parser/
scatter_mapbox_parser.rs1use 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}