#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
mod bindings;
pub mod err;
use crate::err::Error;
pub use bindings::*;
use dlopen::wrapper::Container;
use std::borrow::Cow;
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Binary {
Keysight,
NiVisa,
Primary,
Custom(String),
}
impl Binary {
fn binary_name(&self) -> Result<Cow<str>, Error> {
Ok(match self {
Binary::Keysight => {
if cfg!(target_family = "windows") {
"ktvisa32.dll".into()
} else if cfg!(target_family = "unix") && cfg!(target_pointer_width = "64") {
"libiovisa.so".into()
} else {
return Err(Error::UnsupportedPlatform);
}
} Binary::NiVisa => {
if cfg!(target_family = "windows") && cfg!(target_pointer_width = "64") {
"nivisa64.dll".into()
} else if cfg!(target_family = "windows") && cfg!(target_pointer_width = "32") {
"visa32.dll".into()
} else if cfg!(target_family = "unix") && cfg!(target_pointer_width = "64") {
"libvisa.so".into()
} else {
return Err(Error::UnsupportedPlatform);
}
} Binary::Primary => {
if cfg!(target_family = "windows") {
"visa32".into()
} else if cfg!(target_family = "unix") && cfg!(target_pointer_width = "64") {
"libvisa.so".into()
} else if cfg!(target_family = "unix") && cfg!(target_pointer_width = "32") {
"libvisa32.so".into()
} else {
return Err(Error::UnsupportedPlatform);
}
}
Binary::Custom(path) => path.into(),
})
}
}
impl Default for Binary {
fn default() -> Self {
Binary::Primary
}
}
impl ToString for Binary {
fn to_string(&self) -> String {
self.binary_name()
.unwrap_or_else(|e| e.to_string().into())
.into()
}
}
pub fn create(bin: &Binary) -> Result<Container<VisaFuncs>, Error> {
unsafe { Container::load(bin.binary_name()?.as_ref()).map_err(|e| Error::from(e)) }
}
#[cfg(test)]
mod tests {
use super::Binary;
#[test]
fn failed_to_find_dll_file() {
let binary = Binary::Custom("DummyLibraryThatDoesntExist".into());
let visa = super::create(&binary);
assert!(matches!(visa, Err(_)));
}
}