use std::ops::{Add, AddAssign};
use r3bl_rs_utils_core::*;
use crate::*;
#[derive(Debug, Clone)]
pub struct StyledText {
plain_text: String,
style: Style,
}
impl StyledText {
pub fn new(text: String, style: Style) -> Self {
let plain_text = match ANSIText::try_strip_ansi(&text) {
Some(plain_text) => plain_text,
None => text,
};
StyledText { plain_text, style }
}
pub fn get_plain_text(&self) -> &str { &self.plain_text }
pub fn get_style(&self) -> &Style { &self.style }
}
#[macro_export]
macro_rules! styled_text {
() => {
StyledText::new(String::new(), Style::default())
};
($text:expr) => {
StyledText::new($text.to_string(), Style::default())
};
($text:expr, $style:expr) => {
StyledText::new($text.to_string(), $style)
};
}
impl Add<StyledText> for Vec<StyledText> {
type Output = Vec<StyledText>;
fn add(mut self, other: StyledText) -> Self::Output {
self.push(other);
self
}
}
impl AddAssign<StyledText> for Vec<StyledText> {
fn add_assign(&mut self, other: StyledText) { self.push(other); }
}
pub trait StyledTexts {
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
fn get_plain_text(&self) -> String;
fn render_into(&self, render_ops: &mut RenderOps);
fn display_width(&self) -> ChUnit;
}
impl StyledTexts for Vec<StyledText> {
fn len(&self) -> usize { self.len() }
fn is_empty(&self) -> bool { self.is_empty() }
fn get_plain_text(&self) -> String {
let mut plain_text = String::new();
for styled_text in self {
plain_text.push_str(&styled_text.plain_text);
}
plain_text
}
fn display_width(&self) -> ChUnit {
let unicode_string: UnicodeString = self.get_plain_text().into();
unicode_string.display_width
}
fn render_into(&self, render_ops: &mut RenderOps) {
for styled_text in self {
let style = styled_text.style.clone();
let text = styled_text.plain_text.clone();
render_ops.push(RenderOp::ApplyColors(style.clone().into()));
render_ops.push(RenderOp::PrintTextWithAttributes(text, style.into()));
render_ops.push(RenderOp::ResetColor);
}
}
}
#[macro_export]
macro_rules! styled_texts {
($($style:expr),*) => {
{
let mut styled_text_vec: Vec<StyledText> = Default::default();
$(
styled_text_vec += $style;
)*
styled_text_vec
}
};
}