From 869687714d76643cc8ba9a84a430147acf3b13c6 Mon Sep 17 00:00:00 2001 From: yasuomaidana Date: Fri, 2 Aug 2024 12:19:50 +0900 Subject: [PATCH 01/18] Defining axis serializer function --- plotly/src/layout/mod.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/plotly/src/layout/mod.rs b/plotly/src/layout/mod.rs index 7a70c23..57ec0fe 100644 --- a/plotly/src/layout/mod.rs +++ b/plotly/src/layout/mod.rs @@ -17,6 +17,43 @@ use crate::{ private::{NumOrString, NumOrStringCollection}, }; + +fn serialize_axes(axes: &Option>>>, serializer: S, axis_prefix: &str) -> Result +where + S: Serializer, +{ + let mut map = HashMap::new(); + let axes = axes.as_ref().unwrap(); + + for (i, axis) in axes.iter().enumerate() { + let axe = axis.as_ref().unwrap(); + let key = if i == 0 { + axis_prefix.to_string() + } else { + format!("{}{}", axis_prefix, i + 1) + }; + map.insert(key, axe); + } + + map.serialize(serializer) +} + +fn serialize_x_axes(axes: &Option>>>, serializer:S)-> Result +where S:Serializer{ + serialize_axes(axes, serializer, "xaxis") +} + +fn serialize_y_axes(axes: &Option>>>, serializer:S)-> Result +where S:Serializer{ + serialize_axes(axes, serializer, "yaxis") +} + + +fn serialize_z_axes(axes: &Option>>>, serializer:S)-> Result +where S:Serializer{ + serialize_axes(axes, serializer, "zaxis") +} + #[derive(Serialize, Debug, Clone)] #[serde(rename_all = "lowercase")] pub enum AxisType { From d45f901bf8441a7969c20a6675126f2c7e35358d Mon Sep 17 00:00:00 2001 From: yasuomaidana Date: Fri, 2 Aug 2024 12:21:04 +0900 Subject: [PATCH 02/18] Defining axes as vector instead of filed items values --- plotly/src/layout/mod.rs | 93 +++++----------------------------------- 1 file changed, 11 insertions(+), 82 deletions(-) diff --git a/plotly/src/layout/mod.rs b/plotly/src/layout/mod.rs index 57ec0fe..df4a672 100644 --- a/plotly/src/layout/mod.rs +++ b/plotly/src/layout/mod.rs @@ -2,7 +2,7 @@ pub mod themes; pub mod update_menu; use std::borrow::Cow; - +use std::collections::HashMap; use plotly_derive::FieldSetter; use serde::{Serialize, Serializer}; use update_menu::UpdateMenu; @@ -1743,38 +1743,10 @@ pub struct LayoutTemplate { grid: Option, calendar: Option, - #[serde(rename = "xaxis")] - x_axis: Option>, - #[serde(rename = "yaxis")] - y_axis: Option>, - #[serde(rename = "xaxis2")] - x_axis2: Option>, - #[serde(rename = "yaxis2")] - y_axis2: Option>, - #[serde(rename = "xaxis3")] - x_axis3: Option>, - #[serde(rename = "yaxis3")] - y_axis3: Option>, - #[serde(rename = "xaxis4")] - x_axis4: Option>, - #[serde(rename = "yaxis4")] - y_axis4: Option>, - #[serde(rename = "xaxis5")] - x_axis5: Option>, - #[serde(rename = "yaxis5")] - y_axis5: Option>, - #[serde(rename = "xaxis6")] - x_axis6: Option>, - #[serde(rename = "yaxis6")] - y_axis6: Option>, - #[serde(rename = "xaxis7")] - x_axis7: Option>, - #[serde(rename = "yaxis7")] - y_axis7: Option>, - #[serde(rename = "xaxis8")] - x_axis8: Option>, - #[serde(rename = "yaxis8")] - y_axis8: Option>, + #[serde(flatten, serialize_with="serialize_x_axes")] + x_axis: Option>>>, + #[serde(flatten, serialize_with="serialize_y_axes")] + y_axis: Option>>>, // ternary: Option, scene: Option, @@ -1910,55 +1882,12 @@ pub struct Layout { grid: Option, calendar: Option, - #[serde(rename = "xaxis")] - x_axis: Option>, - #[serde(rename = "yaxis")] - y_axis: Option>, - #[serde(rename = "zaxis")] - z_axis: Option>, - - #[serde(rename = "xaxis2")] - x_axis2: Option>, - #[serde(rename = "yaxis2")] - y_axis2: Option>, - #[serde(rename = "zaxis2")] - z_axis2: Option>, - #[serde(rename = "xaxis3")] - x_axis3: Option>, - #[serde(rename = "yaxis3")] - y_axis3: Option>, - #[serde(rename = "zaxis3")] - z_axis3: Option>, - #[serde(rename = "xaxis4")] - x_axis4: Option>, - #[serde(rename = "yaxis4")] - y_axis4: Option>, - #[serde(rename = "zaxis4")] - z_axis4: Option>, - #[serde(rename = "xaxis5")] - x_axis5: Option>, - #[serde(rename = "yaxis5")] - y_axis5: Option>, - #[serde(rename = "zaxis5")] - z_axis5: Option>, - #[serde(rename = "xaxis6")] - x_axis6: Option>, - #[serde(rename = "yaxis6")] - y_axis6: Option>, - #[serde(rename = "zaxis6")] - z_axis6: Option>, - #[serde(rename = "xaxis7")] - x_axis7: Option>, - #[serde(rename = "yaxis7")] - y_axis7: Option>, - #[serde(rename = "zaxis7")] - z_axis7: Option>, - #[serde(rename = "xaxis8")] - x_axis8: Option>, - #[serde(rename = "yaxis8")] - y_axis8: Option>, - #[serde(rename = "zaxis8")] - z_axis8: Option>, + #[serde(flatten, serialize_with="serialize_x_axes")] + x_axis: Option>>>, + #[serde(flatten, serialize_with="serialize_y_axes")] + y_axis: Option>>>, + #[serde(flatten, serialize_with="serialize_z_axes")] + z_axis: Option>>>, // ternary: Option, scene: Option, From b39bd4e6e771ef471f5d117582566ed5befa52b4 Mon Sep 17 00:00:00 2001 From: yasuomaidana Date: Fri, 2 Aug 2024 12:22:34 +0900 Subject: [PATCH 03/18] Updating layout test to use the new vector axis instead of filed accessed ones --- plotly/src/layout/mod.rs | 54 ++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/plotly/src/layout/mod.rs b/plotly/src/layout/mod.rs index df4a672..72331a4 100644 --- a/plotly/src/layout/mod.rs +++ b/plotly/src/layout/mod.rs @@ -2927,6 +2927,14 @@ mod tests { #[test] fn test_serialize_layout_template() { + + let mut xaxis:Vec>> = Vec::new(); + let mut yaxis:Vec>> = Vec::new(); + for _ in 0..8{ + xaxis.push(Some(Box::new(Axis::new()))); + yaxis.push(Some(Box::new(Axis::new()))); + } + let layout_template = LayoutTemplate::new() .title("Title") .show_legend(false) @@ -2953,22 +2961,8 @@ mod tests { .hover_label(Label::new()) .grid(LayoutGrid::new()) .calendar(Calendar::Jalali) - .x_axis(Axis::new()) - .x_axis2(Axis::new()) - .x_axis3(Axis::new()) - .x_axis4(Axis::new()) - .x_axis5(Axis::new()) - .x_axis6(Axis::new()) - .x_axis7(Axis::new()) - .x_axis8(Axis::new()) - .y_axis(Axis::new()) - .y_axis2(Axis::new()) - .y_axis3(Axis::new()) - .y_axis4(Axis::new()) - .y_axis5(Axis::new()) - .y_axis6(Axis::new()) - .y_axis7(Axis::new()) - .y_axis8(Axis::new()) + .x_axis(xaxis) + .y_axis(yaxis) .annotations(vec![Annotation::new()]) .shapes(vec![Shape::new()]) .new_shape(NewShape::new()) @@ -3069,6 +3063,14 @@ mod tests { #[test] fn test_serialize_layout() { + + let mut xaxis:Vec>> = Vec::new(); + let mut yaxis:Vec>> = Vec::new(); + for _ in 0..8{ + xaxis.push(Some(Box::new(Axis::new()))); + yaxis.push(Some(Box::new(Axis::new()))); + } + let layout = Layout::new() .title("Title") .title(String::from("Title")) @@ -3098,22 +3100,8 @@ mod tests { .template(Template::new()) .grid(LayoutGrid::new()) .calendar(Calendar::Jalali) - .x_axis(Axis::new()) - .x_axis2(Axis::new()) - .x_axis3(Axis::new()) - .x_axis4(Axis::new()) - .x_axis5(Axis::new()) - .x_axis6(Axis::new()) - .x_axis7(Axis::new()) - .x_axis8(Axis::new()) - .y_axis(Axis::new()) - .y_axis2(Axis::new()) - .y_axis3(Axis::new()) - .y_axis4(Axis::new()) - .y_axis5(Axis::new()) - .y_axis6(Axis::new()) - .y_axis7(Axis::new()) - .y_axis8(Axis::new()) + .x_axis(xaxis) + .y_axis(yaxis) .annotations(vec![Annotation::new()]) .shapes(vec![Shape::new()]) .new_shape(NewShape::new()) @@ -3135,7 +3123,7 @@ mod tests { .extend_pie_colors(true) .sunburst_colorway(vec!["#654654"]) .extend_sunburst_colors(false) - .z_axis(Axis::new()) + .z_axis(Vec::from([Some(Box::new(Axis::new()))])) .scene(LayoutScene::new()); let expected = json!({ From 1fc5ab2cf915d06494b98e09bfb51d74b93b9d04 Mon Sep 17 00:00:00 2001 From: yasuomaidana Date: Fri, 2 Aug 2024 12:36:31 +0900 Subject: [PATCH 04/18] Updating themes layout usage signature --- plotly/src/layout/themes.rs | 40 ++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/plotly/src/layout/themes.rs b/plotly/src/layout/themes.rs index a687caa..e5f0cd5 100644 --- a/plotly/src/layout/themes.rs +++ b/plotly/src/layout/themes.rs @@ -64,22 +64,22 @@ pub static PLOTLY_WHITE: Lazy