tatuin_core/
rich_string.rs1use 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}