fn_ptr/
safety.rs

1/// Type-level marker trait for function safety, either [`Safe`] or [`Unsafe`].
2pub trait Safety {
3    /// `true` for safe functions, `false` for unsafe ones.
4    const IS_SAFE: bool;
5}
6
7/// Marker type for safe functions.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9pub struct Safe;
10/// Marker type for unsafe functions.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12pub struct Unsafe;
13
14impl Safety for Safe {
15    const IS_SAFE: bool = true;
16}
17impl Safety for Unsafe {
18    const IS_SAFE: bool = false;
19}
20
21/// Macro to convert a safety token (`safe` or `unsafe`) or a boolean literal to the corresponding [`Safety`] marker type.
22#[macro_export]
23macro_rules! safety {
24    (safe) => {
25        $crate::safety::Safe
26    };
27    (unsafe) => {
28        $crate::safety::Unsafe
29    };
30    (true) => {
31        $crate::safety::Safe
32    };
33    (false) => {
34        $crate::safety::Unsafe
35    };
36}