hostcraft-core 1.1.2

Core library for the hostcraft ecosystem — parsing, manipulation and file I/O for system hosts
Documentation
use crate::error::{HostCraftError, Result};
use crate::file;
use crate::host::HostEntry;
use std::path::{Path, PathBuf};

pub fn get_hosts_path() -> Result<PathBuf> {
    match std::env::consts::OS {
        "windows" => {
            let root = std::env::var("SystemRoot").unwrap_or_else(|_| "C:\\Windows".to_string());
            Ok(PathBuf::from(root)
                .join("System32")
                .join("drivers")
                .join("etc")
                .join("hosts"))
        }
        "macos" | "linux" => Ok(PathBuf::from("/etc/hosts")),
        other => Err(HostCraftError::UnsupportedPlatform(other.to_string())),
    }
}

pub fn write_hosts_to(path: &Path, entries: &[HostEntry]) -> Result<()> {
    file::write_file(path, entries).map_err(|e| {
        if e.kind() == std::io::ErrorKind::PermissionDenied {
            if cfg!(target_os = "windows") {
                HostCraftError::PermissionDenied(format!(
                    "Permission denied: run as Administrator to modify '{}'",
                    path.display()
                ))
            } else {
                HostCraftError::PermissionDenied(format!(
                    "Permission denied: run with sudo to modify '{}'",
                    path.display()
                ))
            }
        } else {
            HostCraftError::Io(e)
        }
    })
}

pub fn write_hosts(entries: &[HostEntry]) -> Result<()> {
    write_hosts_to(&get_hosts_path()?, entries)
}