error_code/
utils.rs

1//!Error code utilities
2use 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)]
48///Maps error code
49pub 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}