1use crate::config::Config;
2use itertools::Itertools;
3
4pub fn installed(config: &Config) -> impl Iterator<Item = Version> {
5 let versions_dir = config.versions_dir();
6 std::fs::read_dir(&versions_dir)
7 .unwrap()
8 .flatten()
9 .flat_map(|path| path.path().file_name().map(ToOwned::to_owned))
10 .flat_map(|dir_os_str| dir_os_str.into_string())
11 .flat_map(|dir_str| dir_str.parse::<Version>())
12 .filter(|version| {
13 versions_dir
14 .join(version.to_string())
15 .join("bin")
17 .join("php")
18 .is_file()
19 })
20 .sorted()
21}
22
23pub fn installed_by<'a>(
24 version: &'a Version,
25 config: &Config,
26) -> impl Iterator<Item = Version> + 'a {
27 installed(config).filter(|v| version.includes(v))
28}
29
30pub fn latest_installed_by(version: &Version, config: &Config) -> Option<Version> {
31 installed_by(version, config).max()
32}
33
34pub mod alias;
35pub mod file;
36pub mod local;
37pub mod semantic;
38pub mod system;
39
40pub use alias::Alias;
41pub use file::File;
42pub use local::Local;
43pub use semantic::Version;