swift_demangle/
demangle.rs

1use std::ffi;
2
3use crate::error::DemangleError;
4
5extern "C" {
6    fn swift_demangle(
7        mangledName: *const u8,
8        mangledNameLength: usize,
9        outputBuffer: *mut u8,
10        outputBufferSize: *mut usize,
11        flags: u32,
12    ) -> *const i8;
13}
14
15
16
17pub fn demangle(s: &str) -> Result<&str, DemangleError> {
18    unsafe {
19        let demangled = swift_demangle(
20            s.as_ptr(),
21            s.len(),
22            std::ptr::null_mut(),
23            std::ptr::null_mut(),
24            0,
25        );
26        if demangled.is_null() {
27            Err(DemangleError::Null)
28        } else {
29            ffi::CStr::from_ptr(demangled)
30                .to_str()
31                .map_err(DemangleError::Utf8Error)
32        }
33    }
34}
35
36#[test]
37fn test_demangle() {
38    assert_eq!(demangle("$sSa").unwrap(), "Swift.Array");
39}