facet_core/types/def/
function.rs

1use crate::Shape;
2
3/// Common fields for function pointer types
4#[derive(Clone, Copy, Debug)]
5#[repr(C)]
6pub struct FunctionPointerDef {
7    /// The calling abi of the function pointer
8    pub abi: FunctionAbi,
9
10    /// All parameter types, in declaration order
11    pub parameters: &'static [&'static Shape],
12
13    /// The return type
14    pub return_type: &'static Shape,
15}
16
17/// The calling ABI of a function pointer
18#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default)]
19#[repr(C)]
20pub enum FunctionAbi {
21    /// C ABI
22    C,
23
24    /// Rust ABI
25    #[default]
26    Rust,
27
28    /// An unknown ABI
29    Unknown,
30}
31impl FunctionAbi {
32    /// Returns the string in `extern "abi-string"` if not [`FunctionAbi::Unknown`].
33    pub fn as_abi_str(&self) -> Option<&str> {
34        match self {
35            FunctionAbi::C => Some("C"),
36            FunctionAbi::Rust => Some("Rust"),
37            FunctionAbi::Unknown => None,
38        }
39    }
40}
41
42impl FunctionPointerDef {
43    /// Construct a `FunctionPointerDef` from its components.
44    pub const fn new(
45        abi: FunctionAbi,
46        parameters: &'static [&'static Shape],
47        return_type: &'static Shape,
48    ) -> Self {
49        Self {
50            abi,
51            parameters,
52            return_type,
53        }
54    }
55}