use libloading::Library;
use std::path::Path;
use super::types::ValidationResult;
use super::PackageValidator;
impl PackageValidator {
pub(super) async fn validate_symbols(
&self,
package_path: &Path,
result: &mut ValidationResult,
) {
match unsafe { Library::new(package_path) } {
Ok(lib) => {
for symbol in &self.required_symbols {
match unsafe { lib.get::<unsafe extern "C" fn()>(symbol.as_bytes()) } {
Ok(_) => {
result.compatibility.required_symbols.push(symbol.clone());
}
Err(_) => {
result.compatibility.missing_symbols.push(symbol.clone());
result
.errors
.push(format!("Required symbol '{}' not found", symbol));
}
}
}
let optional_symbols = [
"cloacina_get_version",
"cloacina_get_author",
"cloacina_get_description",
];
for symbol in &optional_symbols {
if unsafe { lib.get::<unsafe extern "C" fn()>(symbol.as_bytes()).is_ok() } {
result
.compatibility
.required_symbols
.push(symbol.to_string());
}
}
}
Err(e) => {
result
.errors
.push(format!("Cannot load library for symbol validation: {}", e));
}
}
}
}