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