Skip to main content

mdbook_plotly/code_handler/plot_obj_parser/
trace_registry.rs

1use 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(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
23    density_mapbox_parser::parse_density_mapbox_trace(data_obj, context)
24}
25
26fn parse_histogram(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
27    histogram_parser::parse_histogram_trace(data_obj, context)
28}
29
30fn parse_ohlc(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
31    ohlc_parser::parse_ohlc_trace(data_obj, context)
32}
33
34fn parse_image(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
35    image_parser::parse_image_trace(data_obj, context)
36}
37
38fn parse_mesh3d(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
39    mesh3d_parser::parse_mesh3d_trace(data_obj, context)
40}
41
42fn parse_pie(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
43    pie_parser::parse_pie_trace(data_obj, context)
44}
45
46fn parse_sankey(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
47    sankey_parser::parse_sankey_trace(data_obj, context)
48}
49
50fn parse_scatter3d(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
51    scatter3d_parser::parse_scatter3d_trace(data_obj, context)
52}
53
54fn parse_scatter_geo(data_obj: &mut Value, context: &ParseContext<'_>) -> Result<Box<dyn Trace>> {
55    scatter_geo_parser::parse_scatter_geo_trace(data_obj, context)
56}
57
58fn parse_scatter_mapbox(
59    data_obj: &mut Value,
60    context: &ParseContext<'_>,
61) -> Result<Box<dyn Trace>> {
62    scatter_mapbox_parser::parse_scatter_mapbox_trace(data_obj, context)
63}
64
65fn parse_scatter_polar(
66    data_obj: &mut Value,
67    context: &ParseContext<'_>,
68) -> 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}