ps_str/
lib.rs

1pub mod chars;
2pub use chars::CHARS;
3
4#[cfg(test)]
5pub mod tests;
6
7pub trait Utf8Encoder {
8    fn to_utf8_string(&self) -> String;
9}
10
11impl<T: AsRef<[u8]>> Utf8Encoder for T {
12    fn to_utf8_string(&self) -> String {
13        let bytes = self.as_ref();
14        let mut result = String::with_capacity(bytes.len());
15        let mut i = 0;
16
17        while i < bytes.len() {
18            match std::str::from_utf8(&bytes[i..]) {
19                Ok(valid_str) => {
20                    result.push_str(valid_str);
21                    break;
22                }
23                Err(e) => {
24                    if e.valid_up_to() > 0 {
25                        let valid_part = &bytes[i..i + e.valid_up_to()];
26                        result.push_str(unsafe { std::str::from_utf8_unchecked(valid_part) });
27                        i += e.valid_up_to();
28                    }
29
30                    result.push(CHARS[bytes[i] as usize]);
31                    i += 1;
32                }
33            }
34        }
35
36        result
37    }
38}