use serde::{Deserialize, Serialize};
use crate::node::{Common, IntoNode, Node};
use crate::style::Style;
use crate::text::{Line, Span};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Gauge {
#[serde(flatten)]
pub common: Common,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ratio: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub percent: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<Span>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gauge_style: Option<Style>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_unicode: Option<bool>,
}
impl Gauge {
#[must_use]
pub fn new() -> Self {
Self {
common: Common::new(),
ratio: None,
percent: None,
label: None,
gauge_style: None,
use_unicode: None,
}
}
#[must_use]
pub fn ratio(mut self, ratio: f64) -> Self {
self.ratio = Some(ratio);
self
}
#[must_use]
pub fn percent(mut self, percent: u16) -> Self {
self.percent = Some(percent);
self
}
#[must_use]
pub fn label(mut self, label: impl Into<Span>) -> Self {
self.label = Some(label.into());
self
}
#[must_use]
pub fn gauge_style(mut self, style: Style) -> Self {
self.gauge_style = Some(style);
self
}
#[must_use]
pub fn use_unicode(mut self, use_unicode: bool) -> Self {
self.use_unicode = Some(use_unicode);
self
}
}
impl Default for Gauge {
fn default() -> Self {
Self::new()
}
}
impl IntoNode for Gauge {}
impl From<Gauge> for Node {
fn from(g: Gauge) -> Self {
Node::Gauge(g)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum LineSet {
#[default]
Normal,
Thick,
Double,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LineGauge {
#[serde(flatten)]
pub common: Common,
pub ratio: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<Line>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filled_style: Option<Style>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unfilled_style: Option<Style>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line_set: Option<LineSet>,
}
impl LineGauge {
#[must_use]
pub fn new(ratio: f64) -> Self {
Self {
common: Common::new(),
ratio,
label: None,
filled_style: None,
unfilled_style: None,
line_set: None,
}
}
#[must_use]
pub fn label(mut self, label: impl Into<Line>) -> Self {
self.label = Some(label.into());
self
}
#[must_use]
pub fn filled_style(mut self, style: Style) -> Self {
self.filled_style = Some(style);
self
}
#[must_use]
pub fn unfilled_style(mut self, style: Style) -> Self {
self.unfilled_style = Some(style);
self
}
#[must_use]
pub fn line_set(mut self, line_set: LineSet) -> Self {
self.line_set = Some(line_set);
self
}
}
impl Default for LineGauge {
fn default() -> Self {
Self::new(0.0)
}
}
impl IntoNode for LineGauge {}
impl From<LineGauge> for Node {
fn from(g: LineGauge) -> Self {
Node::LineGauge(g)
}
}