Trait stylish_stringlike::text::Paintable [−][src]
pub trait Paintable { fn paint(&self, target: &str) -> String; fn paint_many<'a, T, U, V>(groups: T) -> String
where
T: IntoIterator<Item = (U, V)> + 'a,
U: Borrow<Self> + 'a,
V: Borrow<str> + 'a, { ... } }
Expand description
Provides functionality to display strings with markup.
Required methods
fn paint(&self, target: &str) -> String
[src]
fn paint(&self, target: &str) -> String
[src]Applies markup to a given string.
Example
use stylish_stringlike::text::Paintable; struct MyMarkup { tag: String, } impl Paintable for MyMarkup { fn paint(&self, target: &str) -> String { [ format!("<{}>", self.tag).as_str(), target, format!("</{}>", self.tag).as_str(), ] .iter() .map(|x| *x) .collect() } } let italic = MyMarkup { tag: String::from("i"), }; assert_eq!(italic.paint("foo"), String::from("<i>foo</i>"));
Provided methods
fn paint_many<'a, T, U, V>(groups: T) -> String where
T: IntoIterator<Item = (U, V)> + 'a,
U: Borrow<Self> + 'a,
V: Borrow<str> + 'a,
[src]
fn paint_many<'a, T, U, V>(groups: T) -> String where
T: IntoIterator<Item = (U, V)> + 'a,
U: Borrow<Self> + 'a,
V: Borrow<str> + 'a,
[src]Applies markup to a given iterator of (Paintable
, str
) objects.
Provide an implementation for this if multiple adjacent Paintable
s
can be joined together.
Example
use std::borrow::Borrow; use stylish_stringlike::text::Paintable; #[derive(Clone, Eq, PartialEq)] struct MyMarkup { tag: String, } impl Paintable for MyMarkup { fn paint(&self, target: &str) -> String { [ format!("<{}>", self.tag).as_str(), target, format!("</{}>", self.tag).as_str(), ] .iter() .map(|x| *x) .collect() } fn paint_many<'a, T, U, V>(groups: T) -> String where T: IntoIterator<Item = (U, V)> + 'a, U: Borrow<Self> + 'a, V: Borrow<str> + 'a, { let mut result = String::new(); let mut previous_span = String::new(); let mut previous_tag: Option<MyMarkup> = None; for (painter, s) in groups { match previous_tag { Some(ref p) if painter.borrow() != p => { result += &p.paint(&previous_span); previous_span = String::from(s.borrow()); previous_tag = Some(painter.borrow().clone()); } Some(ref p) => { previous_span.push_str(s.borrow()); } None => { previous_span.push_str(s.borrow()); previous_tag = Some(painter.borrow().clone()); } } } if let Some(p) = previous_tag { if !previous_span.is_empty() { result += &p.paint(&previous_span); } } result } } let italic = MyMarkup { tag: String::from("i"), }; let bold = MyMarkup { tag: String::from("b"), }; let foobarbaz = vec![(&italic, "foo"), (&italic, "bar"), (&bold, "baz")]; assert_eq!( MyMarkup::paint_many(foobarbaz), String::from("<i>foobar</i><b>baz</b>") );