use unix_exec_output_catcher::{fork_exec_and_catch, OCatchStrategy};
use mac_sys_info::error::MacSysInfoError;
use std::collections::BTreeMap;
const SYSCTL_KEYS_ENUM_GEN_NAME: &str = "SysctlKey";
fn main() {
let res = fork_exec_and_catch(
"sysctl",
vec!["sysctl", "-a"],
OCatchStrategy::StdSeparately
).map_err(|e| MacSysInfoError::CantFetchData(e)).unwrap();
let macos_sysctl_key_value_pairs = res.stdout_lines().unwrap()
.iter()
.map(|s| String::from(s.as_str()))
.map(|s| s.split(":")
.collect::<Vec<&str>>()
[0].to_string()
)
.map(|s| {
let key = s
.split(".")
.map(|s| {
s.chars().enumerate().map(|(i, mut c)| {
if i == 0 {
c = c.to_ascii_uppercase()
}
c
})
.collect::<String>()
})
.collect::<String>();
let value = s;
(key, value)
})
.collect::<Vec<(String,String)>>();
let mut macos_sysctl_key_value_map = BTreeMap::new();
macos_sysctl_key_value_pairs.into_iter().for_each(|(key, value)| {
macos_sysctl_key_value_map.insert(key, value);
});
{
println!();
println!();
println!("/// This enum was generated using the binary `sysctl_output_keys_to_rust_code.rs`");
println!("/// It contains (hopefully) all keys that the output of `$ sysctl -a` can show.");
println!("/// This includes information about the CPU, the number of cores and caches.");
println!("/// Might make trouble/inconsistencies with the AppleSi-Macbooks. I can't test it yet.");
println!("#[derive(Debug, Display, PartialEq, Copy, Clone, Eq, Hash)]");
println!("#[allow(non_camel_case_types)]");
println!("pub enum {} {{", SYSCTL_KEYS_ENUM_GEN_NAME);
for (key, value) in &macos_sysctl_key_value_map {
print!(" ");
print!("/// Key for '{}'", value);
print!("\n");
print!(" ");
print!("{},", key);
print!("\n");
}
println!("}}");
println!();
}
{
println!("impl {} {{", SYSCTL_KEYS_ENUM_GEN_NAME);
println!(" /// Returns the name of the key as it is named in");
println!(" /// the output of `$ sysctl -a`");
println!(" pub fn name(&self) -> &'static str {{");
println!(" match self {{");
for (key, value) in &macos_sysctl_key_value_map {
print!(" ");
print!("{}::{} => \"{}\",", SYSCTL_KEYS_ENUM_GEN_NAME, key, value);
print!("\n");
}
println!(" }}");
println!(" }}");
println!("}}");
}
{
println!("impl {} {{", SYSCTL_KEYS_ENUM_GEN_NAME);
println!(" /// Returns a vector containing all Enum elements.");
println!(" pub fn list() -> Vec<{}> {{", SYSCTL_KEYS_ENUM_GEN_NAME);
println!(" vec![");
for (key, _value) in &macos_sysctl_key_value_map {
print!(" ");
print!("{}::{},", SYSCTL_KEYS_ENUM_GEN_NAME, key);
print!("\n");
}
println!(" ]");
println!(" }}");
println!("}}");
}
}