mod discovery;
mod utils;
pub mod build;
pub mod error;
use std::collections::HashSet;
use std::env;
use std::path::PathBuf;
pub fn discover() -> Result<Vec<build::Build>, error::DiscoveryError> {
let mut builds: HashSet<build::Build> = HashSet::new();
discovery::installations_from_env(&mut builds)?;
#[cfg(target_family = "windows")]
{
let system_drive: PathBuf = env::var_os("SystemDrive")
.map(|system_drive_name| format!("{}\\", system_drive_name.to_string_lossy()))
.map(|system_drive| PathBuf::from(system_drive))
.ok_or(error::DiscoveryError::FailedToLocateSystemDrive)?;
discovery::builds_from_dir(&mut builds, system_drive.join("xampp").join("php"))?;
discovery::builds_from_dir(&mut builds, system_drive.join("cygwin64").join("bin"))?;
discovery::builds_from_dir(&mut builds, system_drive.join("cygwin").join("bin"))?;
discovery::builds_from_dir(&mut builds, system_drive.join("tools"))?;
discovery::builds_from_dir(
&mut builds,
system_drive.join("wamp64").join("bin").join("php"),
)?;
discovery::builds_from_dir(
&mut builds,
system_drive.join("wamp").join("bin").join("php"),
)?;
discovery::builds_from_dir(
&mut builds,
system_drive.join("mamp").join("bin").join("php"),
)?;
}
#[cfg(not(target_family = "windows"))]
{
if let Some(home) = env::var_os("HOME") {
let home: PathBuf = home.into();
discovery::scan_dir_for_builds(&mut builds, home.join(".phpbrew").join("php"))?;
discovery::scan_dir_for_builds(&mut builds, home.join(".phpenv").join("versions"))?;
}
#[cfg(target_os = "macos")]
{
discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/local"))?;
discovery::scan_dir_for_builds(
&mut builds,
PathBuf::from("/Applications/MAMP/bin/php/"),
)?;
}
#[cfg(target_os = "linux")]
{
discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/usr"))?;
discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/remi"))?;
}
}
Ok(builds.into_iter().collect())
}