Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter_mapbox_parser.rs

1use super::common::parse_marker;
2use super::until::must_translate_from_context;
3use crate::code_handler::parse_context::ParseContext;
4use crate::{translate_enum_with_config, translate_with_config};
5use anyhow::Result;
6use plotly::{ScatterMapbox, Trace};
7
8pub fn parse_scatter_mapbox_data(
9    sm_obj: &mut serde_json::Value,
10    context: &ParseContext<'_>,
11) -> Result<Box<ScatterMapbox<f64, f64>>> {
12    let lat: Vec<f64> = must_translate_from_context(sm_obj, context, "lat")?;
13    let lon: Vec<f64> = must_translate_from_context(sm_obj, context, "lon")?;
14    let sm = ScatterMapbox::new(lat, lon);
15    let sm = translate_with_config! {
16        sm,
17        sm_obj,
18        context.map(),
19        context.map_eval(),
20        (ids, Vec<String>),
21        (selected_points, Vec<usize>),
22        (show_legend, bool),
23        (name, String),
24        (legend_group, String),
25        (legend_rank, usize),
26        (opacity, f64),
27        (text, String),
28        (text_array, Vec<String>),
29        (text_template, String),
30        (text_template_array, Vec<String>),
31        (hover_text, String),
32        (hover_text_array, Vec<String>),
33        (hover_template, String),
34        (hover_template_array, Vec<String>),
35        (subplot, String),
36        (below, String),
37        (meta, String),
38    }?;
39
40    use plotly::common::Mode;
41    let sm = translate_enum_with_config! {
42        sm,
43        sm_obj,
44        context.map(),
45        context.map_eval(),
46        (mode, {
47            "lines" =>          Mode::Lines,
48            "markers" =>        Mode::Markers,
49            "text" =>           Mode::Text,
50            "linesmarkers" =>   Mode::LinesMarkers,
51            "linestext" =>      Mode::LinesText,
52            "markerstext" =>    Mode::MarkersText,
53            "linemarkerstext" =>Mode::LinesMarkersText,
54            "none" =>           Mode::None,
55        }),
56    }?;
57
58    let sm = if let Some(marker_obj) = sm_obj.get_mut("marker")
59        && marker_obj.is_object()
60    {
61        let marker = parse_marker(marker_obj, context)?;
62        sm.marker(marker)
63    } else {
64        sm
65    };
66
67    Ok(sm)
68}
69
70pub fn parse_scatter_mapbox_trace(
71    sm_obj: &mut serde_json::Value,
72    context: &ParseContext<'_>,
73) -> Result<Box<dyn Trace>> {
74    Ok(parse_scatter_mapbox_data(sm_obj, context)?)
75}