Add support for getting Modes by name

Should support app implementations for multiple binaries
This commit is contained in:
2Shirt 2025-01-12 00:17:18 -08:00
parent 81aa7a8984
commit 828a2736be
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
7 changed files with 39 additions and 17 deletions

2
Cargo.lock generated
View file

@ -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"

View file

@ -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),

View file

@ -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<Self> {
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 {

View file

@ -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<Option<Action>> {
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")

View file

@ -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();

View file

@ -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;
}
_ => {}
}

View file

@ -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;