mdbook_plotly/code_handler/plot_obj_parser/
trace_registry.rs1use super::{
2 bar_parser, box_plot_parser, candlestick_parser, contour_parser, density_mapbox_parser,
3 heat_map_parser, histogram_parser, image_parser, mesh3d_parser, ohlc_parser, pie_parser,
4 sankey_parser, scatter_geo_parser, scatter_mapbox_parser, scatter_parser, scatter_polar_parser,
5 scatter3d_parser, surface_parser, table_parser,
6};
7use crate::code_handler::parse_context::ParseContext;
8use anyhow::{Result, anyhow};
9use plotly::Trace;
10use serde_json::Value;
11
12type TraceParser = fn(&mut Value, &ParseContext<'_>) -> Result<Box<dyn Trace>>;
13
14fn parse_box(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
15 box_plot_parser::parse_box_plot_data(data_obj, context)
16}
17
18fn parse_candlestick(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
19 candlestick_parser::parse_candlestick_data(data_obj, context)
20}
21
22fn parse_density_mapbox(
23 data_obj: &mut Value,
24 context: &ParseContext<'_>,
25) -> Result<Box<dyn Trace>> {
26 density_mapbox_parser::parse_density_mapbox_trace(data_obj, context)
27}
28
29fn parse_histogram(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
30 histogram_parser::parse_histogram_trace(data_obj, context)
31}
32
33fn parse_ohlc(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
34 ohlc_parser::parse_ohlc_trace(data_obj, context)
35}
36
37fn parse_image(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
38 image_parser::parse_image_trace(data_obj, context)
39}
40
41fn parse_mesh3d(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
42 mesh3d_parser::parse_mesh3d_trace(data_obj, context)
43}
44
45fn parse_pie(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
46 pie_parser::parse_pie_trace(data_obj, context)
47}
48
49fn parse_sankey(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
50 sankey_parser::parse_sankey_trace(data_obj, context)
51}
52
53fn parse_scatter3d(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
54 scatter3d_parser::parse_scatter3d_trace(data_obj, context)
55}
56
57fn parse_scatter_geo(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
58 scatter_geo_parser::parse_scatter_geo_trace(data_obj, context)
59}
60
61fn parse_scatter_mapbox(
62 data_obj: &mut Value,
63 context: &ParseContext<'_>,
64) -> Result<Box<dyn Trace>> {
65 scatter_mapbox_parser::parse_scatter_mapbox_trace(data_obj, context)
66}
67
68fn parse_scatter_polar(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
69 scatter_polar_parser::parse_scatter_polar_trace(data_obj, context)
70}
71
72fn parse_table(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
73 table_parser::parse_table_data(data_obj, context)
74}
75
76fn parse_bar(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
77 bar_parser::parse_bar_trace(data_obj, context)
78}
79
80fn parse_contour(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
81 contour_parser::parse_contour_trace(data_obj, context)
82}
83
84fn parse_heatmap(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
85 heat_map_parser::parse_heat_map_trace(data_obj, context)
86}
87
88fn parse_scatter(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
89 scatter_parser::parse_scatter_trace(data_obj, context)
90}
91
92fn parse_surface(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
93 surface_parser::parse_surface_trace(data_obj, context)
94}
95
96const TRACE_PARSERS: &[(&str, TraceParser)] = &[
97 ("bar", parse_bar),
98 ("box", parse_box),
99 ("candlestick", parse_candlestick),
100 ("contour", parse_contour),
101 ("density_mapbox", parse_density_mapbox),
102 ("heatmap", parse_heatmap),
103 ("histogram", parse_histogram),
104 ("ohlc", parse_ohlc),
105 ("image", parse_image),
106 ("mesh3d", parse_mesh3d),
107 ("pie", parse_pie),
108 ("sankey", parse_sankey),
109 ("scatter", parse_scatter),
110 ("scatter3d", parse_scatter3d),
111 ("scatter_geo", parse_scatter_geo),
112 ("scatter_mapbox", parse_scatter_mapbox),
113 ("scatter_polar", parse_scatter_polar),
114 ("surface", parse_surface),
115 ("table", parse_table),
116];
117
118pub fn parse_data_obj(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
119 let data_type = data_obj
120 .get("type")
121 .and_then(|v| v.as_str())
122 .ok_or_else(|| anyhow!("`type` must be a string"))?
123 .to_owned();
124
125 let Some((_, parser)) = TRACE_PARSERS
126 .iter()
127 .find(|(trace_type, _)| *trace_type == data_type.as_str())
128 else {
129 return Err(anyhow!("{} isn't a type in data", data_type));
130 };
131
132 parser(data_obj, context)
133}