1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::{format, Display, String};

/// A trait for converting a value to a [`stylish::String`].
///
/// This trait is automatically implemented for any type which implements the
/// [`stylish::Display`] trait. As such, `ToString` shouldn’t be implemented
/// directly: [`stylish::Display`] should be implemented instead, and you get
/// the `ToString` implementation for free.
pub trait ToStylishString {
    /// Converts the given value to a [`stylish::String`].
    ///
    /// ```rust
    /// struct Warning(&'static str);
    ///
    /// impl stylish::Display for Warning {
    ///     fn fmt(&self, f: &mut stylish::Formatter<'_>) -> stylish::Result {
    ///         f.with(stylish::Foreground(stylish::Color::Red))
    ///             .write_str(self.0)
    ///     }
    /// }
    ///
    /// use stylish::ToStylishString;
    ///
    /// let s: stylish::String = Warning("FIRE").to_stylish_string();
    /// assert_eq!(
    ///     stylish::html::format!("{:s}", Warning("FIRE")),
    ///     stylish::html::format!("{:s}", s),
    /// );
    /// ```
    fn to_stylish_string(&self) -> String;
}

impl<T> ToStylishString for T
where
    T: Display + ?Sized,
{
    fn to_stylish_string(&self) -> String {
        format!("{:s}", self)
    }
}