use super::types::ChartType;
#[derive(Clone, Debug)]
pub struct ChartSeries {
pub name: String,
pub values: Vec<f64>,
}
impl ChartSeries {
pub fn new(name: &str, values: Vec<f64>) -> Self {
ChartSeries {
name: name.to_string(),
values,
}
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
#[derive(Clone, Debug)]
pub struct Chart {
pub title: String,
pub chart_type: ChartType,
pub categories: Vec<String>,
pub series: Vec<ChartSeries>,
pub x: u32, pub y: u32, pub width: u32, pub height: u32, }
impl Chart {
pub fn new(
title: &str,
chart_type: ChartType,
categories: Vec<String>,
x: u32,
y: u32,
width: u32,
height: u32,
) -> Self {
Chart {
title: title.to_string(),
chart_type,
categories,
series: Vec::new(),
x,
y,
width,
height,
}
}
pub fn add_series(mut self, series: ChartSeries) -> Self {
self.series.push(series);
self
}
pub fn category_count(&self) -> usize {
self.categories.len()
}
pub fn series_count(&self) -> usize {
self.series.len()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_chart_series() {
let series = ChartSeries::new("Sales", vec![10.0, 20.0, 30.0]);
assert_eq!(series.name, "Sales");
assert_eq!(series.len(), 3);
assert!(!series.is_empty());
}
#[test]
fn test_chart_add_series() {
let chart = Chart::new("Test", ChartType::Pie, vec!["A".to_string()], 0, 0, 1000000, 1000000)
.add_series(ChartSeries::new("Data", vec![50.0]));
assert_eq!(chart.series_count(), 1);
}
}