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