Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
scatter_polar_parser.rs

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