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