1use crate::types::c_int;
3use crate::MessageBuf;
4
5use core::{fmt, ptr, slice, cmp};
6
7pub(crate) struct FmtCursor<'a> {
8 buf: &'a mut MessageBuf,
9 cursor: usize
10}
11
12impl<'a> FmtCursor<'a> {
13 #[inline(always)]
14 fn as_str(&self) -> &'a str {
15 unsafe {
16 core::str::from_utf8_unchecked(
17 slice::from_raw_parts(self.buf.as_ptr() as *const u8, self.cursor)
18 )
19 }
20 }
21}
22
23impl<'a> fmt::Write for FmtCursor<'a> {
24 #[inline(always)]
25 fn write_str(&mut self, text: &str) -> fmt::Result {
26 let remaining = self.buf.len().saturating_sub(self.cursor);
27 debug_assert!(remaining <= self.buf.len());
28 let size = cmp::min(remaining, text.len());
29 unsafe {
30 ptr::copy_nonoverlapping(text.as_ptr(), self.buf.as_mut_ptr().add(self.cursor) as *mut u8, size);
31 }
32 self.cursor = self.cursor.saturating_add(size);
33 Ok(())
34 }
35}
36
37#[cfg(windows)]
38pub(crate) fn write_message_buf<'a>(out: &'a mut MessageBuf, text: &str) -> &'a str {
39 let mut formatter = FmtCursor {
40 buf: out,
41 cursor: 0,
42 };
43 let _ = fmt::Write::write_str(&mut formatter, text);
44 formatter.as_str()
45}
46
47#[inline(always)]
48pub fn generic_map_error_code(code: c_int) -> &'static str {
50 match code {
51 0 => "Success",
52 _ => "Operation failed",
53 }
54}
55
56pub(crate) fn write_fallback_code(out: &mut MessageBuf, code: c_int) -> &str {
57 let mut formatter = FmtCursor {
58 buf: out,
59 cursor: 0,
60 };
61
62 let _ = fmt::Write::write_str(&mut formatter, generic_map_error_code(code));
63 formatter.as_str()
64}