refactoring, clippy fixes
All checks were successful
/ Quality Check (push) Successful in 1m6s
/ Build (push) Successful in 1m40s

This commit is contained in:
Phani Pavan K
2025-10-31 12:26:00 +05:30
parent 8e7143d1a7
commit 26202cd7d2
4 changed files with 98 additions and 93 deletions

View File

@@ -104,14 +104,6 @@ impl AppState {
}
}
// pub fn print(&self) {
// let tempEntry = &self.entries[0];
// let res = serde_json::to_string(tempEntry).unwrap();
// println!("{res}");
// let resString = tempEntry.to_string();
// println!("{resString}");
// }
pub fn saveConfigToScript(&self) {
let mut outputString: String = String::new();
outputString.push_str("#! /bin/bash\n\n# DO NOT EDIT THIS FILE MANUALLY\n# ANY MODIFICATIONS WILL BE OVERWRITTEN BY STECKBRETT\n# USE THAT STECKBRETT (stb) TO CONFIGURE PORT MAPPINGS.\n\n");
@@ -122,19 +114,12 @@ impl AppState {
))
}
outputString.push_str("\nwait");
// for o in 0..1 {
// println!("test {o}");
// sleep(Duration::from_secs(1));
// }
println!("Writing config to system");
sleep(Duration::from_millis(100));
let _ = std::fs::write("./forward.sh", outputString);
}
pub fn saveConfigToSettingsFile(&mut self) {
// let mut settings = Settings::new(&self.confDir);
// settings.entries = self.entries.clone();
// settings.save(&self.confDir);
self.settings.entries = self.entries.clone();
self.settings.save(&self.confDir);
self.savedHash = self.settings.entryHash();

11
src/ui/entryBox.rs Normal file
View File

@@ -0,0 +1,11 @@
use ratatui::{
style::{Color, Style},
widgets::{Block, Borders},
};
pub fn entryBox(title: String) -> Block<'static> {
Block::default()
.title(title)
.borders(Borders::ALL)
.style(Style::default().fg(Color::White))
}

66
src/ui/header.rs Normal file
View File

@@ -0,0 +1,66 @@
use ratatui::{
style::{Color, Style},
text::Span,
};
use crate::app::status::{AppStatus, CurrentScreen, EditingField, EntryValError};
pub fn getHeaderScreen(scr: &CurrentScreen) -> (Color, Span<'static>) {
match scr {
CurrentScreen::Main => (
Color::LightBlue,
Span::styled("Main Screen", Style::default().fg(Color::LightBlue)),
),
CurrentScreen::Add => (
Color::LightGreen,
Span::styled("Add Window", Style::default().fg(Color::Green)),
),
CurrentScreen::Exit => (
Color::LightRed,
Span::styled("Exit Screen", Style::default().fg(Color::Red)),
),
CurrentScreen::Settings => (
Color::LightBlue,
Span::styled("Settings", Style::default().fg(Color::Blue)),
),
CurrentScreen::Delete => (
Color::Magenta,
Span::styled("Delete", Style::default().fg(Color::Magenta)),
),
}
}
pub fn getHeaderStatus(status: &AppStatus, editingField: &Option<EditingField>) -> Span<'static> {
match status {
AppStatus::Welcome => Span::styled("Welcome", Style::default().fg(Color::White)),
AppStatus::Added => Span::styled("Added", Style::default().fg(Color::Green)),
AppStatus::Deleted => Span::styled("Deleted", Style::default().fg(Color::Magenta)),
AppStatus::Editing => {
if let Some(editing) = editingField {
let curEdit = match editing {
EditingField::FromIP => "From IP",
EditingField::ToIP => "To IP",
EditingField::FromPort => "From Port",
EditingField::ToPort => "To Port",
};
Span::styled(
format!("Editing: {curEdit}"),
Style::default().fg(Color::Green),
)
} else {
Span::styled("Not Editing", Style::default().fg(Color::White))
}
}
AppStatus::Error(e) => {
let errString = match e {
EntryValError::ToPortValError => "To Port Invalid",
EntryValError::FromPortValError => "From Port Invalid",
EntryValError::ToIPValError => "To IP Invalid",
EntryValError::FromIPValError => "From IP Invalid",
EntryValError::None => "",
};
Span::styled(errString, Style::default().fg(Color::Red))
}
AppStatus::Saved => Span::styled("Saved", Style::default().fg(Color::Green)),
}
}

View File

@@ -1,7 +1,9 @@
#![allow(non_snake_case)]
mod centeredRect;
mod entryBox;
mod entryTable;
mod exitPrompt;
mod header;
mod textHints;
use ratatui::{
@@ -9,15 +11,16 @@ use ratatui::{
layout::{Constraint, Direction, Layout},
style::{Color, Style},
text::{Line, Span, Text},
widgets::{Block, Borders, Clear, Padding, Paragraph},
widgets::{Block, Borders, Clear, Paragraph},
};
use crate::app::status::{AppStatus, CurrentScreen, EntryValError};
use crate::app::status::CurrentScreen;
use crate::app::{AppState, status::EditingField};
use crate::ui::centeredRect::centered_rect;
use crate::ui::textHints::hints;
pub fn ui(frame: &mut Frame, app: &mut AppState) {
// -------------------------------------------
// Split entire body into left title+body and right screen+keybinds chunks
let screenChunks = Layout::default()
.direction(ratatui::layout::Direction::Horizontal)
@@ -36,7 +39,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
.constraints([Constraint::Length(3), Constraint::Min(3)])
.split(screenChunks[1]);
// ------------------------
// -------------------------------------------
// Create and add title block
let titleBlock = Block::default()
.borders(Borders::all())
@@ -50,6 +53,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
frame.render_widget(title, titleBodyChunks[0]);
// -------------------------------------------
// table drawing
let table = entryTable::getTableElement(
&app.entries,
@@ -60,6 +64,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
frame.render_stateful_widget(table, titleBodyChunks[1], &mut app.tableState);
// -------------------------------------------
// Renter exit prompt
if let CurrentScreen::Exit = app.screen {
let area = centered_rect(60, 25, titleBodyChunks[1]);
@@ -67,6 +72,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
frame.render_widget(exitPrompt::getExitPara(), area);
}
// -------------------------------------------
// Editing screen popup
if let Some(edit) = &app.currentlyEditing {
let popup = Block::default()
@@ -84,27 +90,14 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
Constraint::Percentage(30),
Constraint::Percentage(20),
Constraint::Percentage(30),
Constraint::Percentage(25),
Constraint::Percentage(20),
])
.split(area);
let mut fromIPBlock = Block::default()
.title("From IP")
.borders(Borders::ALL)
.style(Style::default().fg(Color::White));
let mut toIPBlock = Block::default()
.title("To IP")
.borders(Borders::ALL)
.style(Style::default().fg(Color::White));
let mut fromPortBlock = Block::default()
.title("From Port")
.borders(Borders::ALL)
.style(Style::default().fg(Color::White));
let mut toPortBlock = Block::default()
.title("To Port")
.borders(Borders::ALL)
.style(Style::default().fg(Color::White));
let mut fromIPBlock = entryBox::entryBox("From IP".to_string());
let mut toIPBlock = entryBox::entryBox("To IP".to_string());
let mut fromPortBlock = entryBox::entryBox("From Port".to_string());
let mut toPortBlock = entryBox::entryBox("To Port".to_string());
let activeStyle = Style::default().bg(Color::LightYellow).fg(Color::Black);
match edit {
@@ -130,64 +123,13 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
let mut borderColor = Color::White;
let _ = borderColor; // to suppress warning, remove later
let screenHeader = vec![
match app.screen {
CurrentScreen::Main => {
borderColor = Color::LightBlue;
Span::styled("Main Screen", Style::default().fg(Color::LightBlue))
}
CurrentScreen::Add => {
borderColor = Color::LightGreen;
Span::styled("Add Window", Style::default().fg(Color::Green))
}
CurrentScreen::Exit => {
borderColor = Color::LightRed;
Span::styled("Exit Screen", Style::default().fg(Color::Red))
}
CurrentScreen::Settings => {
borderColor = Color::LightBlue;
Span::styled("Settings", Style::default().fg(Color::Blue))
}
CurrentScreen::Delete => {
borderColor = Color::Magenta;
Span::styled("Delete", Style::default().fg(Color::Magenta))
}
}
.to_owned(),
Span::styled(" | ", Style::default().fg(Color::White)),
{
match &app.appStatus {
AppStatus::Welcome => Span::styled("Welcome", Style::default().fg(Color::White)),
AppStatus::Added => Span::styled("Added", Style::default().fg(Color::Green)),
AppStatus::Deleted => Span::styled("Deleted", Style::default().fg(Color::Magenta)),
AppStatus::Editing => {
if let Some(editing) = &app.currentlyEditing {
let curEdit = match editing {
EditingField::FromIP => "From IP",
EditingField::ToIP => "To IP",
EditingField::FromPort => "From Port",
EditingField::ToPort => "To Port",
};
Span::styled(
format!("Editing: {curEdit}"),
Style::default().fg(Color::Green),
)
} else {
Span::styled("Not Editing", Style::default().fg(Color::White))
}
}
AppStatus::Error(e) => {
let errString = match e {
EntryValError::ToPortValError => "To Port Invalid",
EntryValError::FromPortValError => "From Port Invalid",
EntryValError::ToIPValError => "To IP Invalid",
EntryValError::FromIPValError => "From IP Invalid",
EntryValError::None => "",
};
Span::styled(errString, Style::default().fg(Color::Red))
}
AppStatus::Saved => Span::styled("Saved", Style::default().fg(Color::Green)),
}
let (color, span) = header::getHeaderScreen(&app.screen);
borderColor = color;
span
},
Span::styled(" | ", Style::default().fg(Color::White)),
header::getHeaderStatus(&app.appStatus, &app.currentlyEditing),
];
let screenHeaderPara = Paragraph::new(Line::from(screenHeader)).block(
@@ -195,7 +137,9 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
.borders(Borders::TOP | Borders::LEFT | Borders::RIGHT)
.style(Style::default().fg(borderColor)),
);
frame.render_widget(screenHeaderPara, headerKeybindChunks[0]);
// -------------------------------------------
// Keybinds Entry
let keybinds = {
match app.screen {
@@ -213,6 +157,5 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) {
.style(Style::default().fg(borderColor)),
);
frame.render_widget(screenHeaderPara, headerKeybindChunks[0]);
frame.render_widget(keyBindFooter, headerKeybindChunks[1]);
}