1use crate::{LeanString, ToLeanStringError, UnwrapWithMsg, repr::Repr};
2use alloc::string::String;
3use castaway::{LifetimeFree, match_type};
4use core::{fmt, fmt::Write, num::NonZero};
5
6pub trait ToLeanString {
8 fn to_lean_string(&self) -> LeanString {
16 self.try_to_lean_string().unwrap_with_msg()
17 }
18
19 fn try_to_lean_string(&self) -> Result<LeanString, ToLeanStringError>;
25}
26
27impl<T: fmt::Display> ToLeanString for T {
29 fn try_to_lean_string(&self) -> Result<LeanString, ToLeanStringError> {
30 let repr = match_type!(self, {
31 &i8 as s => Repr::from_num(*s)?,
32 &u8 as s => Repr::from_num(*s)?,
33 &i16 as s => Repr::from_num(*s)?,
34 &u16 as s => Repr::from_num(*s)?,
35 &i32 as s => Repr::from_num(*s)?,
36 &u32 as s => Repr::from_num(*s)?,
37 &i64 as s => Repr::from_num(*s)?,
38 &u64 as s => Repr::from_num(*s)?,
39 &i128 as s => Repr::from_num(*s)?,
40 &u128 as s => Repr::from_num(*s)?,
41 &isize as s => Repr::from_num(*s)?,
42 &usize as s => Repr::from_num(*s)?,
43
44 &NonZero<i8> as s => Repr::from_num(*s)?,
45 &NonZero<u8> as s => Repr::from_num(*s)?,
46 &NonZero<i16> as s => Repr::from_num(*s)?,
47 &NonZero<u16> as s => Repr::from_num(*s)?,
48 &NonZero<i32> as s => Repr::from_num(*s)?,
49 &NonZero<u32> as s => Repr::from_num(*s)?,
50 &NonZero<i64> as s => Repr::from_num(*s)?,
51 &NonZero<u64> as s => Repr::from_num(*s)?,
52 &NonZero<i128> as s => Repr::from_num(*s)?,
53 &NonZero<u128> as s => Repr::from_num(*s)?,
54 &NonZero<isize> as s => Repr::from_num(*s)?,
55 &NonZero<usize> as s => Repr::from_num(*s)?,
56
57 &f32 as s => Repr::from_num(*s)?,
58 &f64 as s => Repr::from_num(*s)?,
59
60 &bool as s => Repr::from_bool(*s),
61 &char as s => Repr::from_char(*s),
62
63 &String as s => Repr::from_str(s.as_str())?,
64 &LeanString as s => return Ok(s.clone()),
65
66 s => {
67 let mut buf = LeanString::new();
68 write!(buf, "{}", s)?;
69 return Ok(buf)
70 }
71 });
72 Ok(LeanString(repr))
73 }
74}
75
76unsafe impl LifetimeFree for LeanString {}
81unsafe impl LifetimeFree for Repr {}