use crate::platform::detection::{detect_distribution, DistroFamily, DistroInfo, PackageManager};
#[derive(Debug, Clone)]
pub struct DistroFacade {
info: DistroInfo,
}
impl DistroFacade {
pub fn detect() -> Self {
Self {
info: detect_distribution(),
}
}
pub fn from_info(info: DistroInfo) -> Self {
Self { info }
}
pub fn id(&self) -> &str {
&self.info.id
}
pub fn name(&self) -> &str {
&self.info.name
}
pub fn version(&self) -> &str {
&self.info.version
}
pub fn codename(&self) -> &str {
&self.info.codename
}
pub fn family(&self) -> DistroFamily {
self.info.family
}
pub fn package_manager(&self) -> PackageManager {
self.info.pkg_manager
}
pub fn id_like(&self) -> &str {
&self.info.id_like
}
pub fn info(&self) -> &DistroInfo {
&self.info
}
pub fn is_debian_family(&self) -> bool {
self.info.family == DistroFamily::Debian
}
pub fn is_arch_family(&self) -> bool {
self.info.family == DistroFamily::Arch
}
pub fn is_rhel_family(&self) -> bool {
self.info.family == DistroFamily::Rhel
}
pub fn is_suse_family(&self) -> bool {
self.info.family == DistroFamily::Suse
}
pub fn uses_apt(&self) -> bool {
self.info.pkg_manager == PackageManager::Apt
}
pub fn uses_pacman(&self) -> bool {
self.info.pkg_manager == PackageManager::Pacman
}
pub fn uses_dnf(&self) -> bool {
self.info.pkg_manager == PackageManager::Dnf
}
pub fn uses_yum(&self) -> bool {
self.info.pkg_manager == PackageManager::Yum
}
pub fn uses_zypper(&self) -> bool {
self.info.pkg_manager == PackageManager::Zypper
}
}
impl Default for DistroFacade {
fn default() -> Self {
Self::detect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_distro_facade_delegates_to_platform() {
let facade = DistroFacade::detect();
assert!(
!facade.id().is_empty(),
"DistroFacade should delegate to platform::detection"
);
}
#[test]
fn test_distro_facade_from_info() {
let info = DistroInfo {
id: "ubuntu".to_string(),
name: "Ubuntu 24.04".to_string(),
version: "24.04".to_string(),
codename: "noble".to_string(),
family: DistroFamily::Debian,
pkg_manager: PackageManager::Apt,
id_like: "debian".to_string(),
};
let facade = DistroFacade::from_info(info.clone());
assert_eq!(facade.id(), "ubuntu");
assert_eq!(facade.family(), DistroFamily::Debian);
assert_eq!(facade.package_manager(), PackageManager::Apt);
assert_eq!(facade.info(), &info);
}
#[test]
fn test_family_classification_debian() {
let info = DistroInfo {
id: "ubuntu".to_string(),
family: DistroFamily::Debian,
pkg_manager: PackageManager::Apt,
..Default::default()
};
let facade = DistroFacade::from_info(info);
assert!(facade.is_debian_family());
assert!(!facade.is_arch_family());
assert!(facade.uses_apt());
}
#[test]
fn test_family_classification_arch() {
let info = DistroInfo {
id: "arch".to_string(),
family: DistroFamily::Arch,
pkg_manager: PackageManager::Pacman,
..Default::default()
};
let facade = DistroFacade::from_info(info);
assert!(facade.is_arch_family());
assert!(!facade.is_debian_family());
assert!(facade.uses_pacman());
}
#[test]
fn test_family_classification_rhel() {
let info = DistroInfo {
id: "fedora".to_string(),
family: DistroFamily::Rhel,
pkg_manager: PackageManager::Dnf,
..Default::default()
};
let facade = DistroFacade::from_info(info);
assert!(facade.is_rhel_family());
assert!(facade.uses_dnf());
}
#[test]
fn test_family_classification_suse() {
let info = DistroInfo {
id: "opensuse-leap".to_string(),
family: DistroFamily::Suse,
pkg_manager: PackageManager::Zypper,
..Default::default()
};
let facade = DistroFacade::from_info(info);
assert!(facade.is_suse_family());
assert!(facade.uses_zypper());
}
#[test]
fn test_family_classification_yum() {
let info = DistroInfo {
id: "centos".to_string(),
family: DistroFamily::Rhel,
pkg_manager: PackageManager::Yum,
..Default::default()
};
let facade = DistroFacade::from_info(info);
assert!(facade.is_rhel_family());
assert!(facade.uses_yum());
}
#[test]
fn test_default_impl() {
let facade = DistroFacade::default();
assert!(!facade.id().is_empty());
}
#[test]
fn test_accessor_methods() {
let info = DistroInfo {
id: "ubuntu".to_string(),
name: "Ubuntu 24.04 LTS".to_string(),
version: "24.04".to_string(),
codename: "noble".to_string(),
family: DistroFamily::Debian,
pkg_manager: PackageManager::Apt,
id_like: "debian".to_string(),
};
let facade = DistroFacade::from_info(info);
assert_eq!(facade.name(), "Ubuntu 24.04 LTS");
assert_eq!(facade.version(), "24.04");
assert_eq!(facade.codename(), "noble");
assert_eq!(facade.id_like(), "debian");
}
}