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