use crate::data::{IntoSeries, Series};
use crate::render::Color;
#[derive(Clone)]
pub struct Bars<'a> {
pub(crate) categories: Vec<String>,
pub(crate) values: Series<'a>,
pub(crate) color: Option<Color>,
pub(crate) label: Option<String>,
}
impl<'a> Bars<'a> {
pub fn new(
categories: impl IntoIterator<Item = impl Into<String>>,
values: impl IntoSeries<'a>,
) -> Bars<'a> {
let categories: Vec<String> = categories.into_iter().map(Into::into).collect();
let values = values.into_series();
assert_eq!(
categories.len(),
values.len(),
"Bars::new requires one category per value"
);
Bars {
categories,
values,
color: None,
label: None,
}
}
#[must_use]
pub fn color(mut self, color: Color) -> Bars<'a> {
self.color = Some(color);
self
}
#[must_use]
pub fn label(mut self, label: impl Into<String>) -> Bars<'a> {
self.label = Some(label.into());
self
}
pub fn into_owned(self) -> Bars<'static> {
Bars {
categories: self.categories,
values: self.values.into_owned(),
color: self.color,
label: self.label,
}
}
}
impl std::fmt::Debug for Bars<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Bars")
.field("bars", &self.categories.len())
.field("color", &self.color)
.finish()
}
}
#[cfg(test)]
#[path = "tests/bars_tests.rs"]
mod tests;