use clap_sys::universal_plugin_id::clap_universal_plugin_id;
use core::ffi::CStr;
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[non_exhaustive]
pub enum UniversalPluginAbi {
Clap,
VST3,
VST2,
AU,
}
impl UniversalPluginAbi {
#[inline]
pub const fn abi_str(&self) -> &'static CStr {
match self {
UniversalPluginAbi::Clap => c"clap",
UniversalPluginAbi::VST3 => c"vst3",
UniversalPluginAbi::VST2 => c"vst2",
UniversalPluginAbi::AU => c"au",
}
}
#[inline]
pub const fn from_abi_str(abi: &CStr) -> Option<Self> {
match abi.to_bytes() {
b"clap" => Some(UniversalPluginAbi::Clap),
b"vst3" => Some(UniversalPluginAbi::VST3),
b"vst2" => Some(UniversalPluginAbi::VST2),
b"au" => Some(UniversalPluginAbi::AU),
_ => None,
}
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct UniversalPluginId<'a> {
pub abi: &'a CStr,
pub id: &'a CStr,
}
impl<'a> UniversalPluginId<'a> {
#[inline]
pub const unsafe fn from_raw(raw: clap_universal_plugin_id) -> Option<Self> {
Some(Self {
abi: if raw.abi.is_null() {
return None;
} else {
unsafe { CStr::from_ptr(raw.abi) }
},
id: if raw.id.is_null() {
return None;
} else {
unsafe { CStr::from_ptr(raw.id) }
},
})
}
#[inline]
pub const unsafe fn from_raw_ptr(ptr: *const clap_universal_plugin_id) -> Option<Self> {
if ptr.is_null() {
return None;
}
let plugin_id = unsafe { ptr.read() };
Self::from_raw(plugin_id)
}
#[inline]
pub const fn clap(id: &'a CStr) -> Self {
Self { abi: c"clap", id }
}
#[inline]
pub const fn abi(&self) -> Option<UniversalPluginAbi> {
UniversalPluginAbi::from_abi_str(self.abi)
}
#[inline]
pub const fn to_raw(&self) -> clap_universal_plugin_id {
clap_universal_plugin_id {
id: self.id.as_ptr(),
abi: self.abi.as_ptr(),
}
}
}