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(
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}