1use crate::{CharString, ToCharStringError, UnwrapWithMsg, repr::Repr};
2use alloc::string::String;
3use castaway::{LifetimeFree, match_type};
4use core::{fmt, fmt::Write, num::NonZero};
5
6pub trait ToCharString {
8 fn to_char_string(&self) -> CharString {
16 self.try_to_char_string().unwrap_with_msg()
17 }
18
19 fn try_to_char_string(&self) -> Result<CharString, ToCharStringError>;
25}
26
27impl<T: fmt::Display> ToCharString for T {
29 fn try_to_char_string(&self) -> Result<CharString, ToCharStringError> {
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 &CharString as s => return Ok(s.clone()),
65
66 s => {
67 let mut buf = CharString::new();
68 write!(buf, "{}", s)?;
69 return Ok(buf)
70 }
71 });
72 Ok(CharString(repr))
73 }
74}
75
76unsafe impl LifetimeFree for CharString {}
81unsafe impl LifetimeFree for Repr {}