windows_helpers/core/
string.rs1use crate::windows;
2use windows::core::HSTRING;
3
4pub trait HStringExt {
5 fn as_safely_truncated_wide(&self, target_len: usize) -> &[u16];
9
10 fn write_truncated(&self, buf: &mut [u16]);
12}
13
14impl HStringExt for HSTRING {
15 fn as_safely_truncated_wide(&self, target_len: usize) -> &[u16] {
16 let slice = self.as_wide();
17 let len = slice.len();
18
19 if target_len >= len {
20 return slice;
22 }
23
24 if len
25 .checked_sub(1)
26 .map(|last_index| is_leading_surrogate(slice[last_index]))
27 .unwrap_or(false )
28 {
29 &slice[..len - 1]
31 } else {
32 &slice[..len]
34 }
35 }
36
37 fn write_truncated(&self, buf: &mut [u16]) {
38 let truncated_slice =
39 self.as_safely_truncated_wide(self.len().min(buf.len() - 1 ));
40
41 buf[..truncated_slice.len()].copy_from_slice(truncated_slice);
42 buf[truncated_slice.len()] = 0;
43 }
44}
45
46const fn is_leading_surrogate(wide_char: u16) -> bool {
47 wide_char >= 0xd800 && wide_char <= 0xdbff
48}