1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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())
}