use super::{CategoryChartData, CategorySeriesData};
#[derive(Debug, Clone)]
pub struct DateAxisChartData {
dates: Vec<String>,
series: Vec<CategorySeriesData>,
number_format: String,
date_format: String,
}
impl DateAxisChartData {
#[must_use]
pub fn new() -> Self {
Self {
dates: Vec::new(),
series: Vec::new(),
number_format: "General".to_string(),
date_format: "yyyy-mm-dd".to_string(),
}
}
#[must_use]
pub fn with_number_format(number_format: &str) -> Self {
Self {
dates: Vec::new(),
series: Vec::new(),
number_format: number_format.to_string(),
date_format: "yyyy-mm-dd".to_string(),
}
}
pub fn add_date(&mut self, date: &str) {
self.dates.push(date.to_string());
}
pub fn add_series(&mut self, name: &str, values: &[f64]) {
let values = values.iter().map(|v| Some(*v)).collect();
let index = self.series.len();
self.series.push(CategorySeriesData {
name: name.to_string(),
values,
number_format: None,
index,
});
}
pub fn add_series_with_options(&mut self, name: &str, values: &[Option<f64>]) {
let index = self.series.len();
self.series.push(CategorySeriesData {
name: name.to_string(),
values: values.to_vec(),
number_format: None,
index,
});
}
#[must_use]
pub fn dates(&self) -> &[String] {
&self.dates
}
#[must_use]
pub fn series(&self) -> &[CategorySeriesData] {
&self.series
}
#[must_use]
pub fn number_format(&self) -> &str {
&self.number_format
}
#[must_use]
pub fn date_format(&self) -> &str {
&self.date_format
}
pub fn set_date_format(&mut self, format: &str) {
self.date_format = format.to_string();
}
#[must_use]
pub fn to_category_chart_data(&self) -> CategoryChartData {
let mut data = CategoryChartData::with_number_format(&self.number_format);
for date in &self.dates {
data.add_category(date);
}
for series in &self.series {
data.add_series_with_options(series.name(), series.values());
}
data
}
}
impl Default for DateAxisChartData {
fn default() -> Self {
Self::new()
}
}