use serde::{Deserialize, Serialize};
use crate::node::{Common, IntoNode, Node};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SparkDirection {
#[default]
LeftToRight,
RightToLeft,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum BarSet {
#[default]
Nine,
Three,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Sparkline {
#[serde(flatten)]
pub common: Common,
pub data: Vec<Option<u64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub direction: Option<SparkDirection>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bar_set: Option<BarSet>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub absent_value_symbol: Option<String>,
}
impl Sparkline {
#[must_use]
pub fn new(data: impl IntoIterator<Item = Option<u64>>) -> Self {
Self {
data: data.into_iter().collect(),
..Self::default()
}
}
#[must_use]
pub fn max(mut self, max: u64) -> Self {
self.max = Some(max);
self
}
#[must_use]
pub fn direction(mut self, direction: SparkDirection) -> Self {
self.direction = Some(direction);
self
}
#[must_use]
pub fn bar_set(mut self, bar_set: BarSet) -> Self {
self.bar_set = Some(bar_set);
self
}
#[must_use]
pub fn absent_value_symbol(mut self, symbol: impl Into<String>) -> Self {
self.absent_value_symbol = Some(symbol.into());
self
}
}
impl IntoNode for Sparkline {}
impl From<Sparkline> for Node {
fn from(s: Sparkline) -> Self {
Node::Sparkline(s)
}
}