mdbook_plotly/code_handler/plot_obj_parser/
bar_parser.rs1use super::until::{Color, Map, must_translate};
2use crate::{translate, translate_enum};
3use anyhow::Result;
4use plotly::Bar;
5
6pub fn parse_bar_data(bar_obj: &mut serde_json::Value, map: &Map) -> Result<Box<Bar<f64, f64>>> {
7 let x: Vec<f64> = must_translate(bar_obj, map, "x")?;
8 let y: Vec<f64> = must_translate(bar_obj, map, "y")?;
9 let bar = Bar::new(x, y);
10 let bar = translate! {
11 bar,
12 bar_obj,
13 map,
14 (ids, Vec<String>),
15 (offset, f64),
16 (offset_array, Vec<f64>),
17 (text, String),
18 (text_array, Vec<String>),
19 (text_template, String),
20 (hover_template, String),
21 (hover_template_array, Vec<String>),
22 (hover_text, String),
23 (hover_text_array, Vec<String>),
24 (name, String),
25 (opacity, f64),
26 (x_axis, String),
27 (y_axis, String),
28 (alignment_group, String),
29 (offset_group, String),
30 (clip_on_axis, bool),
31 (show_legend, bool),
32 (legend_group, String),
33 (width, f64),
34 (text_angle, f64),
35 }?;
36
37 use plotly::common::Orientation;
38 let bar = translate_enum! {
39 bar,
40 bar_obj,
41 map,
42 (orientation, {
43 "v" => Orientation::Vertical,
44 "h" => Orientation::Horizontal,
45 }),
46 }?;
47
48 let bar = if let Some(marker_obj) = bar_obj.get_mut("marker")
49 && marker_obj.is_object()
50 {
51 let marker = plotly::common::Marker::new();
52 let marker = translate! {
53 marker,
54 marker_obj,
55 map,
56 (color, Color),
57 (opacity, f64),
58 (size, usize),
59 (size_array, Vec<usize>),
60 (max_displayed, usize),
61 (size_ref, usize),
62 (size_min, usize),
63 (cauto, bool),
64 (cmax, f64),
65 (cmin, f64),
66 (cmid, f64),
67 (auto_color_scale, bool),
68 (reverse_scale, bool),
69 (show_scale, bool),
70 (outlier_color, Color)
71 }?;
72
73 use plotly::common::{MarkerSymbol, SizeMode};
74 let marker = translate_enum! {
75 marker,
76 marker_obj,
77 map,
78 (symbol, {
79 "circle" => MarkerSymbol::Circle,
80 "square" => MarkerSymbol::Square,
81 "diamond" => MarkerSymbol::Diamond,
82 "cross" => MarkerSymbol::Cross,
83 "x" => MarkerSymbol::X,
84 "triangle-up" => MarkerSymbol::TriangleUp,
85 "triangle-down" => MarkerSymbol::TriangleDown,
86 "triangle-left" => MarkerSymbol::TriangleLeft,
87 "triangle-right" => MarkerSymbol::TriangleRight,
88 "pentagon" => MarkerSymbol::Pentagon,
89 "hexagon" => MarkerSymbol::Hexagon,
90 }),
91 (size_mode, {
92 "area" => SizeMode::Area,
93 "diameter" => SizeMode::Diameter,
94 }),
95 }?;
96 bar.marker(marker)
97 } else {
98 bar
99 };
100
101 Ok(bar)
102}