use crate::error::PptxResult;
use super::super::super::xmlwriter::ChartXmlWriter;
use super::chart_data::CategorySeriesData;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ComboSeriesType {
Bar,
Line,
}
#[derive(Debug, Clone)]
pub struct ComboSeriesData {
pub(crate) inner: CategorySeriesData,
pub(crate) combo_type: ComboSeriesType,
}
impl ComboSeriesData {
#[must_use]
pub fn name(&self) -> &str {
self.inner.name()
}
#[must_use]
pub fn values(&self) -> &[Option<f64>] {
self.inner.values()
}
#[must_use]
pub const fn index(&self) -> usize {
self.inner.index
}
#[must_use]
pub fn number_format(&self) -> Option<&str> {
self.inner.number_format()
}
#[must_use]
pub const fn combo_type(&self) -> ComboSeriesType {
self.combo_type
}
#[must_use]
pub const fn as_category_series(&self) -> &CategorySeriesData {
&self.inner
}
}
#[derive(Debug, Clone)]
pub struct ComboChartData {
categories: Vec<String>,
series: Vec<ComboSeriesData>,
number_format: String,
}
impl ComboChartData {
#[must_use]
pub fn new() -> Self {
Self {
categories: Vec::new(),
series: Vec::new(),
number_format: "General".to_string(),
}
}
pub fn add_category(&mut self, label: &str) {
self.categories.push(label.to_string());
}
pub fn add_series(&mut self, name: &str, combo_type: ComboSeriesType, values: &[f64]) {
let values = values.iter().map(|v| Some(*v)).collect();
let index = self.series.len();
self.series.push(ComboSeriesData {
inner: CategorySeriesData {
name: name.to_string(),
values,
number_format: None,
index,
},
combo_type,
});
}
pub fn add_series_with_options(
&mut self,
name: &str,
combo_type: ComboSeriesType,
values: &[Option<f64>],
) {
let index = self.series.len();
self.series.push(ComboSeriesData {
inner: CategorySeriesData {
name: name.to_string(),
values: values.to_vec(),
number_format: None,
index,
},
combo_type,
});
}
#[must_use]
pub fn categories(&self) -> &[String] {
&self.categories
}
#[must_use]
pub fn series(&self) -> &[ComboSeriesData] {
&self.series
}
#[must_use]
pub fn number_format(&self) -> &str {
&self.number_format
}
#[must_use]
pub fn bar_series(&self) -> Vec<&ComboSeriesData> {
self.series
.iter()
.filter(|s| s.combo_type == ComboSeriesType::Bar)
.collect()
}
#[must_use]
pub fn line_series(&self) -> Vec<&ComboSeriesData> {
self.series
.iter()
.filter(|s| s.combo_type == ComboSeriesType::Line)
.collect()
}
pub fn to_xml(&self) -> PptxResult<String> {
ChartXmlWriter::write_combo(self)
}
}
impl Default for ComboChartData {
fn default() -> Self {
Self::new()
}
}