use crate::Vendor;
pub(crate) use crate::platform::ranges::{parse_range_list_str, parse_range_list_with};
pub(crate) fn parse_vendor_from_string(
parsed_vendor_id_proc: &Option<String>,
parsed_cpu_implementer_proc: &Option<String>,
) -> Vendor {
if let Some(vid_str) = parsed_vendor_id_proc {
match vid_str.as_str() {
"GenuineIntel" => return Vendor::Intel,
"AuthenticAMD" => return Vendor::Amd,
"Apple" => return Vendor::Apple,
_ => {}
}
}
if let Some(imp_str) = parsed_cpu_implementer_proc {
return match imp_str.as_str() {
"0x41" => Vendor::Arm,
"0x61" => Vendor::Apple,
"0x42" => Vendor::Broadcom,
"0x43" => Vendor::Marvell,
"0x4e" => Vendor::Nvidia,
"0x51" => Vendor::Qualcomm,
"0x56" => Vendor::Marvell,
_ => Vendor::Other,
};
}
if parsed_vendor_id_proc.is_some() {
Vendor::Other
} else {
Vendor::Unknown
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn implementer_consulted_without_vendor_id() {
let v = parse_vendor_from_string(&None, &Some("0x41".to_string()));
assert_eq!(v, Vendor::Arm);
let v = parse_vendor_from_string(&None, &Some("0x61".to_string()));
assert_eq!(v, Vendor::Apple);
}
#[test]
fn vendor_id_takes_priority() {
let v =
parse_vendor_from_string(&Some("GenuineIntel".to_string()), &Some("0x41".to_string()));
assert_eq!(v, Vendor::Intel);
}
#[test]
fn unknown_only_when_both_absent() {
assert_eq!(parse_vendor_from_string(&None, &None), Vendor::Unknown);
assert_eq!(
parse_vendor_from_string(&Some("WeirdCorp".to_string()), &None),
Vendor::Other
);
assert_eq!(
parse_vendor_from_string(&None, &Some("0xff".to_string())),
Vendor::Other
);
}
}