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
use crate::config::Config;
use itertools::Itertools;

pub fn installed(config: &Config) -> impl Iterator<Item = Version> {
    let versions_dir = config.versions_dir();
    std::fs::read_dir(&versions_dir)
        .unwrap()
        .flatten()
        .flat_map(|path| path.path().file_name().map(ToOwned::to_owned))
        .flat_map(|dir_os_str| dir_os_str.into_string())
        .flat_map(|dir_str| dir_str.parse::<Version>())
        .filter(|version| {
            versions_dir
                .join(version.to_string())
                // TODO: windows
                .join("bin")
                .join("php")
                .is_file()
        })
        .sorted()
}

pub fn installed_by<'a>(
    version: &'a Version,
    config: &Config,
) -> impl Iterator<Item = Version> + 'a {
    installed(config).filter(|v| version.includes(v))
}

pub fn latest_installed_by(version: &Version, config: &Config) -> Option<Version> {
    installed_by(version, config).max()
}

pub mod alias;
pub mod file;
pub mod local;
pub mod semantic;
pub mod system;

pub use alias::Alias;
pub use file::File;
pub use local::Local;
pub use semantic::Version;