Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
bar_parser.rs

1use 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}