use std::env;
use brush_core::ShellValue;
use sysinfo::System;
use crate::pkg::keys::{Arch, DistroClamp};
pub struct PacstallVariables<'a> {
vars: Vec<(&'a str, String)>,
sysinfo: System,
}
pub(crate) trait AsShellValue {
fn to_shellvalue(self) -> ShellValue;
}
impl<T> AsShellValue for T
where
T: ToString,
{
fn to_shellvalue(self) -> ShellValue {
ShellValue::String(self.to_string())
}
}
impl<'a> IntoIterator for PacstallVariables<'a> {
type Item = (&'a str, String);
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.vars.into_iter()
}
}
impl PacstallVariables<'_> {
pub fn generate() -> Self {
let sysinfo = System::new();
Self {
vars: vec![
("NCPU", Self::ncpu(&sysinfo).to_string()),
("CARCH", Self::carch().to_string()),
("AARCH", match Self::carch() {
Arch::Armhf => Arch::Armv7h,
Arch::I386 => Arch::I686,
default => default,
}.to_string()),
("DISTRO", Self::distro().to_string()),
("KVER", Self::kver()),
("homedir", env::home_dir().expect("Could not get home dir for user").to_string_lossy().to_string()),
],
sysinfo,
}
}
#[must_use]
fn ncpu(sysinfo: &System) -> usize {
let cpu_count = sysinfo.cpus().len();
if let Ok(cpu) = env::var("PACSTALL_BUILD_CORES") {
cpu.parse::<usize>().unwrap_or(cpu_count)
} else {
cpu_count
}
}
#[must_use]
fn carch() -> Arch {
Arch::host()
}
#[must_use]
fn distro() -> DistroClamp {
DistroClamp::system().expect("OOPSIES")
}
#[must_use]
fn kver() -> String {
System::kernel_version().unwrap_or("<unknown>".to_owned())
}
}