Skip to main content

tatuin_core/
rich_string.rs

1// SPDX-License-Identifier: MIT
2
3use crate::{EmojiTransformer, RawLinkTransformer};
4
5pub trait Transformer: std::fmt::Debug {
6    fn transform(&self, s: &str) -> String;
7}
8
9#[derive(Debug)]
10pub struct RichString {
11    s: String,
12    transformers: Vec<Box<dyn Transformer>>,
13}
14
15impl RichString {
16    pub fn new(s: &str) -> Self {
17        Self {
18            s: s.to_string(),
19            transformers: vec![Box::new(RawLinkTransformer {}), Box::new(EmojiTransformer {})],
20        }
21    }
22
23    pub fn with_transformer(mut self, t: Box<dyn Transformer>) -> Self {
24        self.transformers.push(t);
25        self
26    }
27
28    pub fn raw(&self) -> String {
29        self.s.clone()
30    }
31
32    pub fn display(&self) -> String {
33        let mut s = self.raw();
34        for t in &self.transformers {
35            s = t.transform(&s);
36        }
37        s
38    }
39}