Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
pie_parser.rs

1use super::until::{Color, Map, must_translate};
2use crate::{translate, translate_enum};
3use anyhow::Result;
4use plotly::Pie;
5
6pub fn parse_pie_data(pie_obj: &mut serde_json::Value, map: &Map) -> Result<Box<Pie<f64>>> {
7    let pie: Vec<f64> = must_translate(pie_obj, map, "values")?;
8    let pie: Box<Pie<f64>> = Pie::new(pie);
9    let pie = translate! {
10        pie,
11        pie_obj,
12        map,
13        (automargin, bool),
14        (dlabel, f64),
15        (hole, f64),
16        (hover_template, String),
17        (hover_template_array, Vec<String>),
18        (hover_text, String),
19        (hover_text_array, Vec<String>),
20        (ids, Vec<String>),
21        (label0, f64),
22        (labels, Vec<String>),
23        (legend_group, String),
24        (legend_rank, usize),
25        (name, String),
26        (opacity, f64),
27        (meta, String),
28        (sort, bool),
29        (text_position_src, String),
30        (text_position_src_array, Vec<String>),
31        (text, String),
32        (text_array, Vec<String>),
33        (text_info, String),
34        (show_legend, bool),
35        (rotation, f64),
36        (pull, f64),
37    }?;
38
39    use plotly::traces::pie::PieDirection;
40    let pie = translate_enum! {
41        pie,
42        pie_obj,
43        map,
44        (direction, {
45            "clockwise" =>          PieDirection::Clockwise,
46            "counterclockwise" =>   PieDirection::CounterClockwise,
47        }),
48    }?;
49
50    let pie = if let Some(marker_obj) = pie_obj.get_mut("marker")
51        && marker_obj.is_object()
52    {
53        let marker = plotly::common::Marker::new();
54        let marker = translate! {
55            marker,
56            marker_obj,
57            map,
58            (color, Color),
59            (opacity, f64),
60            (size, usize),
61            (size_array, Vec<usize>),
62            (max_displayed, usize),
63            (size_ref, usize),
64            (size_min, usize),
65            (cauto, bool),
66            (cmax, f64),
67            (cmin, f64),
68            (cmid, f64),
69            (auto_color_scale, bool),
70            (reverse_scale, bool),
71            (show_scale, bool),
72            (outlier_color, Color)
73        }?;
74
75        use plotly::common::{MarkerSymbol, SizeMode};
76        let marker = translate_enum! {
77            marker,
78            marker_obj,
79            map,
80            (symbol, {
81                "circle" =>         MarkerSymbol::Circle,
82                "square" =>         MarkerSymbol::Square,
83                "diamond" =>        MarkerSymbol::Diamond,
84                "cross" =>          MarkerSymbol::Cross,
85                "x" =>              MarkerSymbol::X,
86                "triangle-up" =>    MarkerSymbol::TriangleUp,
87                "triangle-down" =>  MarkerSymbol::TriangleDown,
88                "triangle-left" =>  MarkerSymbol::TriangleLeft,
89                "triangle-right" => MarkerSymbol::TriangleRight,
90                "pentagon" =>       MarkerSymbol::Pentagon,
91                "hexagon" =>        MarkerSymbol::Hexagon,
92            }),
93            (size_mode, {
94                "area" => SizeMode::Area,
95                "diameter" => SizeMode::Diameter,
96            }),
97        }?;
98        pie.marker(marker)
99    } else {
100        pie
101    };
102
103    Ok(pie)
104}