Refactor add_disk_details into get_disk_details

Drops requirement to update Disk in-place
This commit is contained in:
2Shirt 2024-11-10 19:30:53 -08:00
parent 92e2e53b16
commit 2ff4a2ce54
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
2 changed files with 18 additions and 16 deletions

View file

@ -31,20 +31,25 @@ use crate::system::disk::{
static DEFAULT_MAX_DISKS: usize = 8; static DEFAULT_MAX_DISKS: usize = 8;
pub fn add_disk_details(disk: &mut Disk, disk_details: Option<&str>) { pub fn get_disk_details(disk_id: &str, disk_size: u64, disk_details: Option<&str>) -> Disk {
static RE_DETAILS: Lazy<Regex> = Lazy::new(|| { static RE_DETAILS: Lazy<Regex> = Lazy::new(|| {
Regex::new(r"(.*?)\r?\nDisk ID\s*:\s+(.*?)\r?\nType\s*:\s+(.*?)\r?\n").unwrap() Regex::new(r"(.*?)\r?\nDisk ID\s*:\s+(.*?)\r?\nType\s*:\s+(.*?)\r?\n").unwrap()
}); });
static RE_UUID: Lazy<Regex> = Lazy::new(|| { static RE_UUID: Lazy<Regex> = Lazy::new(|| {
Regex::new(r"^\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}$").unwrap() Regex::new(r"^\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}$").unwrap()
}); });
let mut disk = Disk {
id: String::from(disk_id),
size: disk_size,
..Default::default()
};
// Get details // Get details
let details: String; let details: String;
if let Some(details_str) = disk_details { if let Some(details_str) = disk_details {
details = String::from(details_str); details = String::from(details_str);
} else { } else {
let script = format!("select disk {}\r\ndetail disk", disk.get_id()); let script = format!("select disk {}\r\ndetail disk", disk_id);
details = run_script(&script); details = run_script(&script);
}; };
@ -59,8 +64,11 @@ pub fn add_disk_details(disk: &mut Disk, disk_details: Option<&str>) {
} else { } else {
disk.part_type = PartitionTableType::Legacy; disk.part_type = PartitionTableType::Legacy;
} }
disk.serial = get_disk_serial_number(&disk.get_id()); disk.serial = get_disk_serial_number(disk_id);
} }
// Done
disk
} }
pub fn add_partition_details( pub fn add_partition_details(
@ -249,9 +257,9 @@ pub fn get_disks() -> Vec<Disk> {
let mut disks_raw: Vec<Disk> = Vec::with_capacity(DEFAULT_MAX_DISKS); let mut disks_raw: Vec<Disk> = Vec::with_capacity(DEFAULT_MAX_DISKS);
for section in dp_sections { for section in dp_sections {
for (_, [id, details]) in RE_DIS_DET.captures_iter(section).map(|c| c.extract()) { for (_, [id, details]) in RE_DIS_DET.captures_iter(section).map(|c| c.extract()) {
if let Some(mut disk) = disks_map.remove(id) { if let Some(disk) = disks_map.remove(id) {
// We remove the disk from the HashMap because we're moving it to the Vec // We remove the disk from the HashMap because we're moving it to the Vec
add_disk_details(&mut disk, Some(details)); let mut disk = get_disk_details(disk.id.as_str(), disk.size, Some(details));
add_partition_details(&mut disk, Some(details), None); add_partition_details(&mut disk, Some(details), None);
disk.generate_descriptions(); disk.generate_descriptions();
disks_raw.push(disk); disks_raw.push(disk);
@ -323,13 +331,11 @@ pub fn parse_partition_details(disk: &mut Disk, contents: &str) {
} }
} }
pub fn refresh_disk_info(disk: &mut Disk) { pub fn refresh_disk_info(disk: &Disk) {
// TODO: Needs refactor - assuming add_ functions are replaced with get_ variants // TODO: Needs refactor - assuming add_ functions are replaced with get_ variants
info!("Refresh disk info"); info!("Refresh disk info");
disk.parts.clear(); let mut disk = get_disk_details(disk.get_id(), disk.size, None);
disk.parts_description.clear(); add_partition_details(&mut disk, None, None);
add_disk_details(disk, None);
add_partition_details(disk, None, None);
disk.generate_descriptions(); disk.generate_descriptions();
} }

View file

@ -22,9 +22,7 @@ mod diskpart {
#[test] #[test]
fn add_disk_details_gpt() { fn add_disk_details_gpt() {
let mut disk = system::disk::Disk::default(); let disk = system::diskpart::get_disk_details("", 0, Some(sample_output::DETAIL_DISK_GPT));
system::diskpart::add_disk_details(&mut disk, Some(sample_output::DETAIL_DISK_GPT));
assert_eq!(disk.model, "Red Hat VirtIO SCSI Disk Device"); assert_eq!(disk.model, "Red Hat VirtIO SCSI Disk Device");
assert_eq!(disk.part_type, system::disk::PartitionTableType::Guid); assert_eq!(disk.part_type, system::disk::PartitionTableType::Guid);
assert_eq!(disk.conn_type, "SCSI"); assert_eq!(disk.conn_type, "SCSI");
@ -32,9 +30,7 @@ mod diskpart {
#[test] #[test]
fn add_disk_details_mbr() { fn add_disk_details_mbr() {
let mut disk = system::disk::Disk::default(); let disk = system::diskpart::get_disk_details("", 0, Some(sample_output::DETAIL_DISK_MBR));
system::diskpart::add_disk_details(&mut disk, Some(sample_output::DETAIL_DISK_MBR));
assert_eq!(disk.model, "Red Hat VirtIO SCSI Disk Device"); assert_eq!(disk.model, "Red Hat VirtIO SCSI Disk Device");
assert_eq!(disk.part_type, system::disk::PartitionTableType::Legacy); assert_eq!(disk.part_type, system::disk::PartitionTableType::Legacy);
assert_eq!(disk.conn_type, "SCSI"); assert_eq!(disk.conn_type, "SCSI");