use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Spec {
#[serde(default)]
pub data: Option<Data>,
pub mark: Mark,
pub encoding: Encoding,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub width: Option<usize>,
#[serde(default)]
pub height: Option<usize>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Data {
#[serde(default)]
pub values: Option<Vec<serde_json::Map<String, serde_json::Value>>>,
#[serde(default)]
pub columns: Option<Vec<Column>>,
#[serde(default)]
pub rows: Option<Vec<Vec<serde_json::Value>>>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Column {
pub name: String,
#[serde(default, rename = "type")]
pub ty: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Mark {
Bar,
Line,
Point,
Area,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Encoding {
pub x: Channel,
pub y: Channel,
#[serde(default)]
pub color: Option<Channel>,
#[serde(default, rename = "xOffset")]
pub x_offset: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Channel {
pub field: String,
#[serde(default, rename = "type")]
pub ty: Option<FieldType>,
#[serde(default)]
pub aggregate: Option<Aggregate>,
#[serde(default, rename = "timeUnit")]
pub time_unit: Option<TimeUnit>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum FieldType {
Quantitative,
Nominal,
Ordinal,
Temporal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum TimeUnit {
Year,
Quarter,
Month,
Week,
Day,
Hour,
Minute,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Aggregate {
Sum,
Mean,
Median,
Min,
Max,
Count,
}