php_discovery/
lib.rs

1mod discovery;
2mod utils;
3
4pub mod build;
5pub mod error;
6
7use std::collections::HashSet;
8use std::env;
9use std::path::PathBuf;
10
11/// Discover all available PHP builds.
12pub fn discover() -> Result<Vec<build::Build>, error::DiscoveryError> {
13    let mut builds: HashSet<build::Build> = HashSet::new();
14
15    discovery::installations_from_env(&mut builds)?;
16
17    #[cfg(target_family = "windows")]
18    {
19        let system_drive: PathBuf = env::var_os("SystemDrive")
20            .map(|system_drive_name| format!("{}\\", system_drive_name.to_string_lossy()))
21            .map(|system_drive| PathBuf::from(system_drive))
22            .ok_or(error::DiscoveryError::FailedToLocateSystemDrive)?;
23
24        // XAMPP
25        discovery::builds_from_dir(&mut builds, system_drive.join("xampp").join("php"))?;
26        // Cygwin
27        discovery::builds_from_dir(&mut builds, system_drive.join("cygwin64").join("bin"))?;
28        discovery::builds_from_dir(&mut builds, system_drive.join("cygwin").join("bin"))?;
29        // Chocolatey
30        discovery::builds_from_dir(&mut builds, system_drive.join("tools"))?;
31        // WAMP
32        discovery::builds_from_dir(
33            &mut builds,
34            system_drive.join("wamp64").join("bin").join("php"),
35        )?;
36        discovery::builds_from_dir(
37            &mut builds,
38            system_drive.join("wamp").join("bin").join("php"),
39        )?;
40        // MAMP
41        discovery::builds_from_dir(
42            &mut builds,
43            system_drive.join("mamp").join("bin").join("php"),
44        )?;
45    }
46
47    #[cfg(not(target_family = "windows"))]
48    {
49        if let Some(home) = env::var_os("HOME") {
50            let home: PathBuf = home.into();
51
52            // phpbrew
53            discovery::scan_dir_for_builds(&mut builds, home.join(".phpbrew").join("php"))?;
54            // .phpenv
55            discovery::scan_dir_for_builds(&mut builds, home.join(".phpenv").join("versions"))?;
56        }
57
58        #[cfg(target_os = "macos")]
59        {
60            // MacPorts (/opt/local/sbin/php-fpm71, /opt/local/bin/php71)
61            discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/local"))?;
62            // MAMP
63            discovery::scan_dir_for_builds(
64                &mut builds,
65                PathBuf::from("/Applications/MAMP/bin/php/"),
66            )?;
67        }
68
69        #[cfg(target_os = "linux")]
70        {
71            // Ondrej PPA on Linux (bin/php7.2)
72            discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/usr"))?;
73            // Remi's RPM repository
74            discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/remi"))?;
75        }
76    }
77
78    Ok(builds.into_iter().collect())
79}