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