Compare commits

...

2 Commits

Author SHA1 Message Date
Liam
9aad900456
Merge 12ba829d49 into 49379a7ede 2024-10-08 10:42:37 +02:00
Liam
12ba829d49
refactor: Handle temporary directories entirely within core 2024-10-03 22:37:23 -07:00
5 changed files with 29 additions and 16 deletions

1
Cargo.lock generated
View File

@ -510,7 +510,6 @@ dependencies = [
"portable-pty", "portable-pty",
"rand", "rand",
"ratatui", "ratatui",
"temp-dir",
"tree-sitter-bash", "tree-sitter-bash",
"tree-sitter-highlight", "tree-sitter-highlight",
"tui-term", "tui-term",

View File

@ -1,6 +1,7 @@
use std::{ use std::{
fs::File, fs::File,
io::{BufRead, BufReader, Read}, io::{BufRead, BufReader, Read},
ops::{Deref, DerefMut},
os::unix::fs::PermissionsExt, os::unix::fs::PermissionsExt,
path::{Path, PathBuf}, path::{Path, PathBuf},
rc::Rc, rc::Rc,
@ -14,8 +15,26 @@ use temp_dir::TempDir;
const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs"); const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) { // Allow the unused TempDir to be stored for later destructor call
let (temp_dir, tab_files) = TabList::get_tabs(); #[allow(dead_code)]
pub struct TabList(pub Vec<Tab>, TempDir);
// Implement deref to allow Vec<Tab> methods to be called on TabList
impl Deref for TabList {
type Target = Vec<Tab>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for TabList {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
pub fn get_tabs(validate: bool) -> TabList {
let (temp_dir, tab_files) = TabDirectories::get_tabs();
let tabs: Vec<_> = tab_files let tabs: Vec<_> = tab_files
.into_iter() .into_iter()
@ -62,11 +81,11 @@ pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
if tabs.is_empty() { if tabs.is_empty() {
panic!("No tabs found"); panic!("No tabs found");
} }
(temp_dir, tabs) TabList(tabs, temp_dir)
} }
#[derive(Deserialize)] #[derive(Deserialize)]
struct TabList { struct TabDirectories {
directories: Vec<PathBuf>, directories: Vec<PathBuf>,
} }
@ -252,9 +271,9 @@ fn is_executable(path: &Path) -> bool {
.unwrap_or(false) .unwrap_or(false)
} }
impl TabList { impl TabDirectories {
fn get_tabs() -> (TempDir, Vec<PathBuf>) { fn get_tabs() -> (TempDir, Vec<PathBuf>) {
let temp_dir = TempDir::new().unwrap(); let temp_dir = TempDir::with_prefix("linutil_scripts").unwrap();
TAB_DATA TAB_DATA
.extract(&temp_dir) .extract(&temp_dir)
.expect("Failed to extract the saved directory"); .expect("Failed to extract the saved directory");

View File

@ -5,7 +5,7 @@ use std::rc::Rc;
use ego_tree::Tree; use ego_tree::Tree;
use std::path::PathBuf; use std::path::PathBuf;
pub use inner::get_tabs; pub use inner::{get_tabs, TabList};
#[derive(Clone, Hash, Eq, PartialEq)] #[derive(Clone, Hash, Eq, PartialEq)]
pub enum Command { pub enum Command {

View File

@ -22,7 +22,6 @@ oneshot = "0.1.8"
portable-pty = "0.8.1" portable-pty = "0.8.1"
ratatui = "0.28.1" ratatui = "0.28.1"
tui-term = "0.1.12" tui-term = "0.1.12"
temp-dir = "0.1.14"
unicode-width = "0.2.0" unicode-width = "0.2.0"
rand = { version = "0.8.5", optional = true } rand = { version = "0.8.5", optional = true }
linutil_core = { path = "../core", version = "24.9.28" } linutil_core = { path = "../core", version = "24.9.28" }

View File

@ -11,7 +11,7 @@ use crate::{
}; };
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers}; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use ego_tree::NodeId; use ego_tree::NodeId;
use linutil_core::{ListNode, Tab}; use linutil_core::{ListNode, TabList};
#[cfg(feature = "tips")] #[cfg(feature = "tips")]
use rand::Rng; use rand::Rng;
use ratatui::{ use ratatui::{
@ -21,7 +21,6 @@ use ratatui::{
widgets::{Block, Borders, List, ListState, Paragraph}, widgets::{Block, Borders, List, ListState, Paragraph},
Frame, Frame,
}; };
use temp_dir::TempDir;
const MIN_WIDTH: u16 = 77; const MIN_WIDTH: u16 = 77;
const MIN_HEIGHT: u16 = 19; const MIN_HEIGHT: u16 = 19;
@ -41,14 +40,12 @@ P* - privileged *
"; ";
pub struct AppState { pub struct AppState {
/// This must be passed to retain the temp dir until the end of the program
_temp_dir: TempDir,
/// Selected theme /// Selected theme
theme: Theme, theme: Theme,
/// Currently focused area /// Currently focused area
pub focus: Focus, pub focus: Focus,
/// List of tabs /// List of tabs
tabs: Vec<Tab>, tabs: TabList,
/// Current tab /// Current tab
current_tab: ListState, current_tab: ListState,
/// This stack keeps track of our "current directory". You can think of it as `pwd`. but not /// This stack keeps track of our "current directory". You can think of it as `pwd`. but not
@ -81,11 +78,10 @@ pub struct ListEntry {
impl AppState { impl AppState {
pub fn new(theme: Theme, override_validation: bool) -> Self { pub fn new(theme: Theme, override_validation: bool) -> Self {
let (temp_dir, tabs) = linutil_core::get_tabs(!override_validation); let tabs = linutil_core::get_tabs(!override_validation);
let root_id = tabs[0].tree.root().id(); let root_id = tabs[0].tree.root().id();
let mut state = Self { let mut state = Self {
_temp_dir: temp_dir,
theme, theme,
focus: Focus::List, focus: Focus::List,
tabs, tabs,