use std::collections::HashMap;
use super::source::ConfigSourceProvides;
#[derive(Debug, Clone)]
pub struct PlatformInfo {
pub os: String,
pub distro: Option<String>,
pub distro_version: Option<String>,
}
pub fn detect_platform() -> PlatformInfo {
let os = match std::env::consts::OS {
"macos" => "macos".to_string(),
other => other.to_string(),
};
let (distro, version) = if os == "linux" {
parse_os_release_file()
} else {
(None, None)
};
PlatformInfo {
os,
distro,
distro_version: version,
}
}
pub fn match_platform_profile(
platform: &PlatformInfo,
platform_profiles: &HashMap<String, String>,
) -> Option<String> {
if let Some(ref distro) = platform.distro
&& let Some(path) = platform_profiles.get(distro)
{
return Some(path.clone());
}
if let Some(path) = platform_profiles.get(&platform.os) {
return Some(path.clone());
}
None
}
fn parse_os_release_file() -> (Option<String>, Option<String>) {
let fields = crate::platform::parse_os_release_content(
&std::fs::read_to_string("/etc/os-release").unwrap_or_default(),
);
(
fields.get("ID").map(|v| v.to_lowercase()),
fields.get("VERSION_ID").cloned(),
)
}
pub fn source_profile_names(provides: &ConfigSourceProvides) -> Vec<String> {
if !provides.profile_details.is_empty() {
provides
.profile_details
.iter()
.map(|p| p.name.clone())
.collect()
} else {
provides.profiles.clone()
}
}