use serde::{Deserialize, Serialize};
fn is_false(v: &bool) -> bool {
!*v
}
pub fn is_plain_style(s: &Style) -> bool {
*s == Style::plain()
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct Style {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fg: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bg: Option<u8>,
#[serde(default, skip_serializing_if = "is_false")]
pub dim: bool,
#[serde(default, skip_serializing_if = "is_false")]
pub bold: bool,
#[serde(default, skip_serializing_if = "is_false")]
pub italic: bool,
#[serde(default, skip_serializing_if = "is_false")]
pub underline: bool,
#[serde(default, skip_serializing_if = "is_false")]
pub blink: bool,
#[serde(default, skip_serializing_if = "is_false", rename = "reverse")]
pub inverse: bool,
#[serde(default, skip_serializing_if = "is_false", rename = "strikethrough")]
pub strike: bool,
}
impl Style {
pub const fn plain() -> Self {
Self {
fg: None,
bg: None,
dim: false,
bold: false,
italic: false,
underline: false,
blink: false,
inverse: false,
strike: false,
}
}
#[must_use]
pub const fn overlay(self, top: Style) -> Style {
Style {
fg: match top.fg {
Some(v) => Some(v),
None => self.fg,
},
bg: match top.bg {
Some(v) => Some(v),
None => self.bg,
},
dim: self.dim || top.dim,
bold: self.bold || top.bold,
italic: self.italic || top.italic,
underline: self.underline || top.underline,
blink: self.blink || top.blink,
inverse: self.inverse || top.inverse,
strike: self.strike || top.strike,
}
}
}