From 828a2736be365cf32347ed97c0e2d6d83bdd94c7 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sun, 12 Jan 2025 00:17:18 -0800 Subject: [PATCH] Add support for getting Modes by name Should support app implementations for multiple binaries --- Cargo.lock | 2 +- deja_vu/src/action.rs | 3 +-- deja_vu/src/app.rs | 31 ++++++++++++++++++++++++------- deja_vu/src/components/footer.rs | 2 ++ deja_vu/src/components/left.rs | 5 +++-- deja_vu/src/components/popup.rs | 8 +++++--- deja_vu/src/components/right.rs | 5 +++-- 7 files changed, 39 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 835fa64..d1d23d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" diff --git a/deja_vu/src/action.rs b/deja_vu/src/action.rs index ba18a79..8bdbb1e 100644 --- a/deja_vu/src/action.rs +++ b/deja_vu/src/action.rs @@ -17,7 +17,6 @@ use serde::{Deserialize, Serialize}; use strum::Display; use crate::{ - app::Mode, components::popup::Type, system::{ disk::{Disk, PartitionTableType}, @@ -40,7 +39,7 @@ pub enum Action { DisplayPopup(Type, String), NextScreen, PrevScreen, - SetMode(Mode), + SetMode(String), // TUI ClearScreen, Error(String), diff --git a/deja_vu/src/app.rs b/deja_vu/src/app.rs index e9c0a24..7a98d36 100644 --- a/deja_vu/src/app.rs +++ b/deja_vu/src/app.rs @@ -17,6 +17,7 @@ use std::{ env, iter::zip, + str::FromStr, sync::{Arc, Mutex}, }; @@ -27,6 +28,7 @@ use ratatui::{ prelude::Rect, }; use serde::{Deserialize, Serialize}; +use strum::{Display, EnumString}; use tokio::sync::mpsc; use tracing::{debug, info}; @@ -71,7 +73,9 @@ pub struct App { tasks: Tasks, } -#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive( + Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, EnumString, Display, +)] pub enum Mode { #[default] ScanDisks, @@ -87,6 +91,13 @@ pub enum Mode { Failed, } +impl Mode { + pub fn get_mode(mode_str: &str) -> Self { + let error_msg = format!("Failed to get app Mode: '{}'", mode_str); + Self::from_str(mode_str).expect(&error_msg) + } +} + impl App { pub fn new(tick_rate: f64, frame_rate: f64) -> Result { let (action_tx, action_rx) = mpsc::unbounded_channel(); @@ -373,10 +384,12 @@ impl App { Action::Error(ref msg) => { self.action_tx .send(Action::DisplayPopup(popup::Type::Error, msg.clone()))?; - self.action_tx.send(Action::SetMode(Mode::Failed))?; + self.action_tx + .send(Action::SetMode(String::from("Failed")))?; } Action::InstallDriver => { - self.action_tx.send(Action::SetMode(Mode::InstallDrivers))?; + self.action_tx + .send(Action::SetMode(String::from("InstallDrivers")))?; } Action::SelectDriver(ref driver) => { self.driver = Some(driver.clone()); @@ -394,15 +407,17 @@ impl App { (Mode::SelectTableType, Mode::SelectTableType) => Mode::SelectDisks, (_, _) => self.prev_mode, }; - self.action_tx.send(Action::SetMode(new_mode))?; + self.action_tx.send(Action::SetMode(new_mode.to_string()))?; } Action::NextScreen => { if let Some(mode) = self.next_mode() { self.action_tx.send(Action::DismissPopup)?; - self.action_tx.send(Action::SetMode(mode))?; + self.action_tx.send(Action::SetMode(mode.to_string()))?; } } - Action::ScanDisks => self.action_tx.send(Action::SetMode(Mode::ScanDisks))?, + Action::ScanDisks => self + .action_tx + .send(Action::SetMode(String::from("ScanDisks")))?, Action::Select(one, two) => { match self.cur_mode { Mode::SelectDisks => { @@ -418,7 +433,9 @@ impl App { self.selections[0] = one; self.selections[1] = two; } - Action::SetMode(new_mode) => self.set_mode(new_mode)?, + Action::SetMode(ref new_mode_string) => { + self.set_mode(Mode::get_mode(&new_mode_string))? + } _ => {} } for component in &mut self.components { diff --git a/deja_vu/src/components/footer.rs b/deja_vu/src/components/footer.rs index 1530cd7..4610fe3 100644 --- a/deja_vu/src/components/footer.rs +++ b/deja_vu/src/components/footer.rs @@ -18,6 +18,7 @@ use ratatui::{ prelude::*, widgets::{Block, Borders, Paragraph}, }; +use std::str::FromStr; use tokio::sync::mpsc::UnboundedSender; use super::Component; @@ -52,6 +53,7 @@ impl Component for Footer { fn update(&mut self, action: Action) -> Result> { if let Action::SetMode(new_mode) = action { + let new_mode = Mode::from_str(&new_mode)?; self.text = match new_mode { Mode::ScanDisks | Mode::PreClone | Mode::Clone | Mode::PostClone => { String::from("(q) to quit") diff --git a/deja_vu/src/components/left.rs b/deja_vu/src/components/left.rs index 8ccfa12..2725245 100644 --- a/deja_vu/src/components/left.rs +++ b/deja_vu/src/components/left.rs @@ -19,6 +19,7 @@ use ratatui::{ prelude::*, widgets::{Block, Borders, HighlightSpacing, List, ListItem, Padding, Paragraph}, }; +use std::str::FromStr; use tokio::sync::mpsc::UnboundedSender; use tracing::info; @@ -173,8 +174,8 @@ impl Component for Left { } Action::SetMode(new_mode) => { let prev_mode = self.mode; - self.mode = new_mode; - match (prev_mode, new_mode) { + self.mode = Mode::from_str(&new_mode)?; + match (prev_mode, Mode::from_str(&new_mode)?) { (_, Mode::ScanDisks) => { self.list_disks.clear_items(); self.title_text = String::new(); diff --git a/deja_vu/src/components/popup.rs b/deja_vu/src/components/popup.rs index 933dbde..0901f85 100644 --- a/deja_vu/src/components/popup.rs +++ b/deja_vu/src/components/popup.rs @@ -19,6 +19,7 @@ use ratatui::{ widgets::{Block, Borders, Clear, Paragraph, Wrap}, }; use serde::{Deserialize, Serialize}; +use std::str::FromStr; use strum::Display; use tokio::sync::mpsc::UnboundedSender; @@ -69,11 +70,12 @@ impl Component for Popup { self.popup_type = new_type; self.popup_text = new_text; } - Action::SetMode(mode) => { - if mode == Mode::ScanDisks { + Action::SetMode(mode_string) => { + let new_mode = Mode::get_mode(&mode_string); + if new_mode == Mode::ScanDisks { self.popup_text = String::from("Scanning Disks..."); } - self.mode = mode; + self.mode = new_mode; } _ => {} } diff --git a/deja_vu/src/components/right.rs b/deja_vu/src/components/right.rs index d053b25..8787577 100644 --- a/deja_vu/src/components/right.rs +++ b/deja_vu/src/components/right.rs @@ -19,6 +19,7 @@ use ratatui::{ prelude::*, widgets::{Block, Borders, Padding, Paragraph, Wrap}, }; +use std::str::FromStr; use tokio::sync::mpsc::UnboundedSender; use tracing::info; @@ -94,9 +95,9 @@ impl Component for Right { self.selections[1] = two; } Action::SelectTableType(table_type) => self.table_type = Some(table_type), - Action::SetMode(new_mode) => { + Action::SetMode(new_mode_string) => { self.prev_mode = self.cur_mode; - self.cur_mode = new_mode; + self.cur_mode = Mode::from_str(&new_mode_string)?; match self.cur_mode { Mode::SelectDisks => { self.selections[0] = None;