use serde::{Deserialize, Serialize};
#[cfg(feature = "schema")]
use schemars::JsonSchema;
use super::style::ColorValue;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub struct ChartDataPoint {
pub label: String,
pub value: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub color: Option<ColorValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub struct ListItem {
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub checked: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payload: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(tag = "draw", rename_all = "camelCase")]
pub enum CanvasDrawCommand {
#[serde(rename = "circle")]
Circle {
cx: f64,
cy: f64,
r: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
fill: Option<ColorValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
stroke: Option<ColorValue>,
#[serde(
rename = "strokeWidth",
default,
skip_serializing_if = "Option::is_none"
)]
stroke_width: Option<f64>,
},
#[serde(rename = "line")]
Line {
x1: f64,
y1: f64,
x2: f64,
y2: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
stroke: Option<ColorValue>,
#[serde(
rename = "strokeWidth",
default,
skip_serializing_if = "Option::is_none"
)]
stroke_width: Option<f64>,
#[serde(rename = "lineCap", default, skip_serializing_if = "Option::is_none")]
line_cap: Option<String>,
},
#[serde(rename = "rect")]
Rect {
x: f64,
y: f64,
width: f64,
height: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
fill: Option<ColorValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
stroke: Option<ColorValue>,
#[serde(
rename = "strokeWidth",
default,
skip_serializing_if = "Option::is_none"
)]
stroke_width: Option<f64>,
#[serde(
rename = "cornerRadius",
default,
skip_serializing_if = "Option::is_none"
)]
corner_radius: Option<f64>,
},
#[serde(rename = "arc")]
Arc {
cx: f64,
cy: f64,
r: f64,
#[serde(rename = "startAngle")]
start_angle: f64,
#[serde(rename = "endAngle")]
end_angle: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
fill: Option<ColorValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
stroke: Option<ColorValue>,
#[serde(
rename = "strokeWidth",
default,
skip_serializing_if = "Option::is_none"
)]
stroke_width: Option<f64>,
},
#[serde(rename = "text")]
Text {
x: f64,
y: f64,
content: String,
#[serde(rename = "fontSize", default, skip_serializing_if = "Option::is_none")]
font_size: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
color: Option<ColorValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
anchor: Option<String>,
},
#[serde(rename = "path")]
Path {
d: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
fill: Option<ColorValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
stroke: Option<ColorValue>,
#[serde(
rename = "strokeWidth",
default,
skip_serializing_if = "Option::is_none"
)]
stroke_width: Option<f64>,
},
}