1//! This module contains the logic to style some content.
2
3use std::fmt::{self, Display, Formatter};
4
5use super::{ContentStyle, PrintStyledContent};
6
7/// The style with the content to be styled.
8///
9/// # Examples
10///
11/// ```rust
12/// use crossterm::style::{style, Color, Attribute, Stylize};
13///
14/// let styled = "Hello there"
15/// .with(Color::Yellow)
16/// .on(Color::Blue)
17/// .attribute(Attribute::Bold);
18///
19/// println!("{}", styled);
20/// ```
21#[derive(Copy, Clone, Debug, Eq, PartialEq)]
22pub struct StyledContent<D: Display> {
23 /// The style (colors, content attributes).
24 style: ContentStyle,
25 /// A content to apply the style on.
26 content: D,
27}
28
29impl<D: Display> StyledContent<D> {
30 /// Creates a new `StyledContent`.
31 #[inline]
32 pub fn new(style: ContentStyle, content: D) -> StyledContent<D> {
33 StyledContent { style, content }
34 }
35
36 /// Returns the content.
37 #[inline]
38 pub fn content(&self) -> &D {
39 &self.content
40 }
41
42 /// Returns the style.
43 #[inline]
44 pub fn style(&self) -> &ContentStyle {
45 &self.style
46 }
47
48 /// Returns a mutable reference to the style, so that it can be further
49 /// manipulated
50 #[inline]
51 pub fn style_mut(&mut self) -> &mut ContentStyle {
52 &mut self.style
53 }
54}
55
56impl<D: Display> AsRef<ContentStyle> for StyledContent<D> {
57 fn as_ref(&self) -> &ContentStyle {
58 &self.style
59 }
60}
61impl<D: Display> AsMut<ContentStyle> for StyledContent<D> {
62 fn as_mut(&mut self) -> &mut ContentStyle {
63 &mut self.style
64 }
65}
66
67impl<D: Display> Display for StyledContent<D> {
68 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
69 crate::command::execute_fmt(
70 f,
71 command:PrintStyledContent(StyledContent {
72 style: self.style,
73 content: &self.content,
74 }),
75 )
76 }
77}
78