1mod discovery;
2mod utils;
3
4pub mod build;
5pub mod error;
6
7use std::collections::HashSet;
8use std::env;
9use std::path::PathBuf;
10
11pub 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 discovery::builds_from_dir(&mut builds, system_drive.join("xampp").join("php"))?;
26 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 discovery::builds_from_dir(&mut builds, system_drive.join("tools"))?;
31 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 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 discovery::scan_dir_for_builds(&mut builds, home.join(".phpbrew").join("php"))?;
54 discovery::scan_dir_for_builds(&mut builds, home.join(".phpenv").join("versions"))?;
56 }
57
58 #[cfg(target_os = "macos")]
59 {
60 discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/local"))?;
62 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 discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/usr"))?;
73 discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/remi"))?;
75 }
76 }
77
78 Ok(builds.into_iter().collect())
79}