diff --git a/win_installer/src/app.rs b/win_installer/src/app.rs index c634696..257d70b 100644 --- a/win_installer/src/app.rs +++ b/win_installer/src/app.rs @@ -166,11 +166,12 @@ impl App { )); // Build Diskpart script to format destination disk - let disk_list = self.state.disk_list.lock().unwrap(); - if let Some(disk_index) = self.state.disk_index_dest - && let Some(disk) = disk_list.get(disk_index) - { - let table_type = self.state.table_type.clone().unwrap(); + if let Some(disk) = self.state.get_dest_disk() { + let table_type = self + .state + .table_type + .clone() + .expect("Failed to get table type."); let diskpart_script = build_dest_format_script( disk.id, &table_type, @@ -196,15 +197,24 @@ impl App { let wimlib_imagex = program_files.join("wimlib\\wimlib-imagex.exe"); // Get image info - let wim_sources = self.state.wim_sources.lock().unwrap(); - let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap()); - let wim_index = self.state.wim_image_index.unwrap() + 1; // wimapply uses 1-based index + let wim_file_index = self + .state + .wim_file_index + .expect("Failed to get source WIM file index"); + let mut wim_image_index = self + .state + .wim_image_index + .expect("Failed to get source WIM image index"); + let wim_sources = self + .state + .wim_sources + .lock() + .expect("Failed to get WIM Sources"); + let wim_file = wim_sources.get_file(wim_file_index); + wim_image_index += 1; // wimapply uses 1-based index // Add actions - let disk_list = self.state.disk_list.lock().unwrap(); - if let Some(disk_index) = self.state.disk_index_dest - && let Some(disk) = disk_list.get(disk_index) - { + if let Some(disk) = self.state.get_dest_disk() { let num_parts = disk.parts.len(); let dest_path = format!("{}:\\", disk.get_part_letter(num_parts - 1)); self.tasks.add(TaskType::CommandWait( @@ -212,7 +222,7 @@ impl App { vec![ String::from("apply"), wim_file.path, - format!("{wim_index}"), + format!("{wim_image_index}"), dest_path, ], )); @@ -223,24 +233,32 @@ impl App { popup::Type::Info, String::from("Updating boot configuration"), ))?; - let wim_sources = self.state.wim_sources.lock().unwrap(); - let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap()); + let wim_index = self + .state + .wim_image_index + .expect("Failed to get source WIM index"); + let wim_sources = self + .state + .wim_sources + .lock() + .expect("Failed to get WIM Sources"); + let wim_file = wim_sources.get_file(wim_index); // Get System32 path let system32 = get_system32_path(&self.action_tx); // Add actions - let disk_list = self.state.disk_list.lock().unwrap(); - if let Some(disk_index) = self.state.disk_index_dest - && let Some(disk) = disk_list.get(disk_index) - { - let table_type = self.state.table_type.clone().unwrap(); + if let Some(disk) = self.state.get_dest_disk() { + let table_type = self + .state + .table_type + .clone() + .expect("Failed to get table type."); let letter_boot = disk.get_part_letter(0); - let letter_os = - disk.get_part_letter(match self.state.table_type.clone().unwrap() { - PartitionTableType::Guid => 2, - PartitionTableType::Legacy => 1, - }); + let letter_os = disk.get_part_letter(match table_type { + PartitionTableType::Guid => 2, + PartitionTableType::Legacy => 1, + }); info!("PostClone // Disk: {disk:?}"); info!("\t\tBoot letter: {letter_boot}"); info!("\t\tOS letter: {letter_os}"); @@ -541,9 +559,11 @@ impl App { } } Mode::SelectWinSource => { + info!("Set WIM file to: {one:?}"); self.state.wim_file_index = one; } Mode::SelectWinImage => { + info!("Set WIM index to: {one:?}"); self.state.wim_image_index = one; } _ => {} @@ -711,7 +731,7 @@ fn build_left_items(app: &App) -> Action { Mode::SelectDisks => { select_type = SelectionType::One; title = String::from("Select Destination Disk"); - let disk_list = app.state.disk_list.lock().unwrap(); + let disk_list = app.state.disk_list.lock().expect("Failed to get disk list"); disk_list .iter() .for_each(|disk| items.push(disk.description.to_string())); @@ -790,14 +810,19 @@ fn build_right_items(app: &App) -> Action { } else { labels.push(vec![dest_dv_line]); } - let disk_list = app.state.disk_list.lock().unwrap(); + let disk_list = app.state.disk_list.lock().expect("Failed to get disk list"); disk_list .iter() .for_each(|disk| items.push(get_disk_description_right(disk, &None))); } Mode::SelectWinSource => { // Disk Info - let type_str = match app.state.table_type.clone().unwrap() { + let type_str = match app + .state + .table_type + .clone() + .expect("Failed to get table type") + { PartitionTableType::Guid => "GPT", PartitionTableType::Legacy => "MBR", }; @@ -815,11 +840,8 @@ fn build_right_items(app: &App) -> Action { }, DVLine::blank(), ]; - let disk_list = app.state.disk_list.lock().unwrap(); - if let Some(index) = app.state.disk_index_dest - && let Some(disk) = disk_list.get(index) - { - get_disk_description_right(disk, &None) + if let Some(disk) = app.state.get_dest_disk() { + get_disk_description_right(&disk, &None) .into_iter() .for_each(|dv_line| label_dv_lines.push(dv_line)); } @@ -870,7 +892,12 @@ fn build_right_items(app: &App) -> Action { panic!("Failed to get source WIM file"); } // Disk Info - let type_str = match app.state.table_type.clone().unwrap() { + let type_str = match app + .state + .table_type + .clone() + .expect("Failed to get table type") + { PartitionTableType::Guid => "GPT", PartitionTableType::Legacy => "MBR", }; @@ -888,11 +915,8 @@ fn build_right_items(app: &App) -> Action { }, DVLine::blank(), ]; - let disk_list = app.state.disk_list.lock().unwrap(); - if let Some(index) = app.state.disk_index_dest - && let Some(disk) = disk_list.get(index) - { - get_disk_description_right(disk, &None) + if let Some(disk) = app.state.get_dest_disk() { + get_disk_description_right(&disk, &None) .into_iter() .for_each(|dv_line| label_dv_lines.push(dv_line)); } @@ -976,11 +1000,8 @@ fn build_right_items(app: &App) -> Action { } else { labels.push(vec![dest_dv_line]); } - let disk_list = app.state.disk_list.lock().unwrap(); - if let Some(index) = app.state.disk_index_dest - && let Some(disk) = disk_list.get(index) - { - items.push(get_disk_description_right(disk, &None)); + if let Some(disk) = app.state.get_dest_disk() { + items.push(get_disk_description_right(&disk, &None)); } } _ => {} diff --git a/win_installer/src/state.rs b/win_installer/src/state.rs index fea2a26..4bbde2e 100644 --- a/win_installer/src/state.rs +++ b/win_installer/src/state.rs @@ -62,6 +62,17 @@ impl State { } } + pub fn get_dest_disk(&self) -> Option { + let mut dest_disk: Option = None; + if let Ok(disk_list) = self.disk_list.lock() + && let Some(disk_index) = self.disk_index_dest + && let Some(disk) = disk_list.get(disk_index) + { + dest_disk = Some(disk.clone()); + } + dest_disk + } + pub fn reset_all(&mut self) { self.wim_file_index = None; self.wim_image_index = None; diff --git a/win_installer/src/wim.rs b/win_installer/src/wim.rs index 433d0aa..8f194cf 100644 --- a/win_installer/src/wim.rs +++ b/win_installer/src/wim.rs @@ -26,6 +26,7 @@ use std::{ use tempfile::NamedTempFile; use tokio::task::JoinHandle; +use tracing::info; use xml::reader::{EventReader, XmlEvent}; use core::system::disk::bytes_to_string; @@ -187,10 +188,17 @@ impl WimSources { rel_index = index - num_local; use_local = false; }; + info!("Converted Index: {index} -> {rel_index}"); if use_local { - self.local.get(rel_index).unwrap().clone() + self.local + .get(rel_index) + .expect("Failed to get local file by rel_index") + .to_owned() } else { - self.network.get(rel_index).unwrap().clone() + self.network + .get(rel_index) + .expect("Failed to get network file by rel_index") + .to_owned() } }