Skip to main content

mdbook_plotly/code_handler/
plot_obj_parser.rs

1use super::parse_context::ParseContext;
2pub use super::until;
3use super::until::Map;
4use crate::preprocessor::config::MapEvalConfig;
5use anyhow::Result;
6use plotly::Plot;
7use serde_json::Value;
8
9pub mod bar_parser;
10pub mod box_plot_parser;
11pub mod candlestick_parser;
12pub mod common;
13pub mod contour_parser;
14pub mod density_mapbox_parser;
15pub mod heat_map_parser;
16pub mod histogram_parser;
17pub mod image_parser;
18pub mod layout_parser;
19pub mod mesh3d_parser;
20pub mod ohlc_parser;
21pub mod pie_parser;
22pub mod sankey_parser;
23pub mod scatter3d_parser;
24pub mod scatter_geo_parser;
25pub mod scatter_mapbox_parser;
26pub mod scatter_parser;
27pub mod scatter_polar_parser;
28pub mod surface_parser;
29pub mod table_parser;
30pub mod trace_registry;
31
32use layout_parser::{parse_config_obj, parse_layout_obj};
33use trace_registry::parse_data_obj;
34
35pub fn parse(plot_obj: &mut Value, map_eval: &MapEvalConfig) -> Result<Plot> {
36    let mut plot = Plot::new();
37
38    let map = if let Some(map_obj) = plot_obj.get_mut("map") {
39        serde_json::from_value::<Map>(map_obj.take())?
40    } else {
41        Map::new()
42    };
43
44    let context = ParseContext::new(&map, map_eval);
45
46    if let Some(config_obj) = plot_obj.get_mut("config")
47        && config_obj.is_object()
48    {
49        let config = parse_config_obj(config_obj, &context)?;
50        plot.set_configuration(config);
51    }
52
53    if let Some(layout_obj) = plot_obj.get_mut("layout")
54        && layout_obj.is_object()
55    {
56        let layout = parse_layout_obj(layout_obj, &context)?;
57        plot.set_layout(layout);
58    }
59
60    if let Some(data_list) = plot_obj.get_mut("data")
61        && data_list.is_array()
62    {
63        for data in data_list.as_array_mut().unwrap_or_else(|| unreachable!()) {
64            let trace = parse_data_obj(data, &context)?;
65            plot.add_trace(trace);
66        }
67    }
68
69    Ok(plot)
70}