0

I would like to implement a generic function to apply style red and attribute bold to any type which can be converted into a string.

This function works, but only for &str arguments:

use crossterm::style::Stylize;

fn red(str: &str) -> <&str as Stylize>::Styled {
    str.red().bold()
}

I would like this function to work for instance in the following cases:

println!("{}", red("test"));
println!("{}", red("test".to_owned()));
println!("{}", red(1+1));

In all three cases, red text should be printed to the terminal. I tried the following implementation:

fn red<T: Stylize>(str: T) -> <T as Stylize>::Styled {
    str.red().bold()
}

but it does not compile, with message:

error[E0599]: no method named `bold` found for associated type `<T as Stylize>::Styled` in the current scope
  --> src\bin\orphanext-cli.rs:92:15
   |
92 |     str.red().bold()
   |               ^^^^ method not found in `<T as Stylize>::Styled`

I understand the meaning of the compiler message, but I cannot find a proper solution that works in all three cases listed above. Of course I would like the function to call to_string() only when necessary, so only for instance if I pass a i32, not if I pass a &str or a String.

In other words:

  • When I provide a &str the function should behave as the following one:
fn red(str: &str) -> <&str as Stylize>::Styled {
    str.red().bold()
}
  • When I provide a String the function should behave as the following one:
fn red(str: String) -> <String as Stylize>::Styled {
    str.red().bold()
}
  • When I provide a i32 (or any other type implementing trait Display) the function should behave as the following one:
fn red(num: i32) -> <String as Stylize>::Styled {
    num.to_string().red().bold()
}
lucatrv
  • 725
  • 8
  • 14
  • 1
    I'm not sure you can return a regular `&str`. You probably have to wrap it in something, like `Styled::Red(Styled::Bold(s))`. – tadman Feb 07 '23 at 03:55
  • You should provide more code. For example, your implementation of Stylize/Styled or `use` if you used them and the desired output. – denis.peplin Feb 07 '23 at 07:02

0 Answers0