use backend::elements::line_chart::*;
use serde::ser::{Serialize, SerializeStruct, Serializer};
use backend::traits::Graphable;
pub struct LineChart {
identifier: String,
description: String,
width: u32,
height: u32,
padding: u32,
signals: Vec<LineChartSignal>,
data: Vec<LineChartData>,
scales: Vec<LineChartScale>,
axes: Vec<LineChartAxis>,
marks: Vec<LineChartMark>,
}
impl LineChart {
pub fn new() -> LineChart {
LineChart {
identifier: String::from("line_chart"),
description: String::from("Line Chart"),
width: 500,
height: 300,
padding: 5,
signals: vec![LineChartSignal::new()],
data: vec![LineChartData::new()],
scales: vec![
LineChartScale::new_xscale(),
LineChartScale::new_yscale(),
LineChartScale::new_ordinal_scale(),
],
axes: vec![LineChartAxis::new_xaxis(), LineChartAxis::new_yaxis()],
marks: vec![LineChartMark::new()],
}
}
pub fn set_identifier(&mut self, id: &str) {
self.identifier = String::from(id);
}
pub fn set_description(&mut self, description: &str) {
self.description = String::from(description);
}
pub fn add_data(&mut self, x: i64, y: i64, z: i64) {
self.data[0].add_data(x, y, z);
}
pub fn set_dimensions(&mut self, t: (u32, u32)) {
self.height = t.0;
self.width = t.1;
}
pub fn set_padding(&mut self, padding: u32) {
self.padding = padding;
}
}
impl Serialize for LineChart {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut s = serializer.serialize_struct("line_chart", 10)?;
s.serialize_field(
"$schema",
"https://vega.github.io/schema/vega/v3.0.json",
)?;
s.serialize_field("width", &self.width)?;
s.serialize_field("height", &self.height)?;
s.serialize_field("padding", &self.padding)?;
s.serialize_field("signals", &self.signals)?;
s.serialize_field("data", &self.data)?;
s.serialize_field("scales", &self.scales)?;
s.serialize_field("axes", &self.axes)?;
s.serialize_field("marks", &self.marks)?;
s.end()
}
}
impl Graphable for LineChart {
fn get_description(&self) -> &str {
&self.description
}
fn get_identifier(&self) -> &str {
&self.identifier
}
}