#[cfg(all(feature = "embedded", not(feature = "embedded-bundle")))]
use crate::FalkorDBError;
use crate::FalkorResult;
#[cfg(all(feature = "embedded", not(feature = "embedded-bundle")))]
#[path = "provision_shared.rs"]
mod shared;
#[cfg(all(feature = "embedded", not(feature = "embedded-bundle")))]
pub use shared::{module_checksum, Platform, FALKORDB_VERSION};
#[cfg(all(feature = "embedded", not(feature = "embedded-bundle")))]
impl Platform {
pub fn detect() -> Self {
let os = std::env::consts::OS;
let arch = std::env::consts::ARCH;
let os_release = if os == "linux" {
std::fs::read_to_string("/etc/os-release").ok()
} else {
None
};
Self::classify(os, arch, os_release.as_deref(), cfg!(target_env = "musl"))
}
pub fn asset_filename(&self) -> Result<&'static str, FalkorDBError> {
self.asset_filename_opt().ok_or_else(|| match self {
Platform::MacOSX64Unsupported => FalkorDBError::EmbeddedServerError(
"macOS on x86_64 is not supported for auto-provisioning: there is no x86_64 \
FalkorDB module. On Apple Silicon, build and run your application as aarch64 \
(arm64) rather than under Rosetta 2. Alternatively, set falkordb_module_path to \
an arm64 `falkordb.so` and use an arm64 redis-server."
.to_string(),
),
_ => FalkorDBError::EmbeddedServerError(format!(
"FalkorDB embedded server is not supported on {}/{}. \
Supported platforms: Linux x86_64/aarch64 (glibc/musl), macOS aarch64.",
std::env::consts::OS,
std::env::consts::ARCH
)),
})
}
pub fn tag(&self) -> Result<&'static str, FalkorDBError> {
self.tag_opt().ok_or_else(|| match self {
Platform::MacOSX64Unsupported => {
FalkorDBError::EmbeddedServerError("macOS x86_64 is not supported.".to_string())
}
_ => FalkorDBError::EmbeddedServerError("Unsupported platform.".to_string()),
})
}
}
pub fn check_macos_libomp() -> FalkorResult<bool> {
#[cfg(target_os = "macos")]
{
let libomp_paths = [
"/opt/homebrew/opt/libomp/lib/libomp.dylib",
"/usr/local/opt/libomp/lib/libomp.dylib",
];
for path in &libomp_paths {
if std::path::Path::new(path).exists() {
return Ok(true);
}
}
Err(crate::FalkorDBError::EmbeddedServerError(
"FalkorDB module requires OpenMP (libomp) on macOS. \
Install it with: brew install libomp\n\
Then try again. See https://www.falkordb.com/ for more information."
.to_string(),
))
}
#[cfg(not(target_os = "macos"))]
{
Ok(false)
}
}
#[cfg(all(test, feature = "embedded", not(feature = "embedded-bundle")))]
mod tests {
use super::*;
#[test]
fn test_detect_returns_a_platform() {
let platform = Platform::detect();
let _ = platform.asset_filename();
let _ = platform.tag();
}
#[test]
fn test_asset_filename_and_tag_errors_on_unsupported() {
assert!(Platform::Unsupported.asset_filename().is_err());
assert!(Platform::Unsupported.tag().is_err());
assert!(Platform::MacOSX64Unsupported.asset_filename().is_err());
assert!(Platform::MacOSX64Unsupported.tag().is_err());
}
#[test]
fn test_asset_filename_ok_for_supported() {
assert_eq!(
Platform::LinuxX64Glibc.asset_filename().unwrap(),
"falkordb-x64.so"
);
assert_eq!(
Platform::MacOSArm64.asset_filename().unwrap(),
"falkordb-macos-arm64v8.so"
);
assert_eq!(Platform::Rhel8X64.tag().unwrap(), "rhel8-x64");
}
}
#[cfg(test)]
mod libomp_tests {
use super::*;
#[test]
fn test_check_macos_libomp_is_total() {
let _ = check_macos_libomp();
}
}