Skip to content

Commit

Permalink
refact: Handle temporary directories entirely within core (#754)
Browse files Browse the repository at this point in the history
* refactor: Handle temporary directories entirely within core

* fix (xtask): Handle modified tablist struct

* refactor (xtask): Apply Clippy suggested changes

* Fix size_bypass

---------

Co-authored-by: Chris Titus <[email protected]>
  • Loading branch information
lj3954 and ChrisTitusTech authored Nov 6, 2024
1 parent c36879e commit 6728e7e
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 28 deletions.
39 changes: 33 additions & 6 deletions core/src/inner.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::{
fs::File,
io::{BufRead, BufReader, Read},
ops::{Deref, DerefMut},
os::unix::fs::PermissionsExt,
path::{Path, PathBuf},
rc::Rc,
Expand All @@ -14,8 +15,34 @@ use temp_dir::TempDir;

const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");

pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
let (temp_dir, tab_files) = TabList::get_tabs();
// Allow the unused TempDir to be stored for later destructor call
#[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
}
}
impl IntoIterator for TabList {
type Item = Tab;
type IntoIter = std::vec::IntoIter<Self::Item>;

fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}

pub fn get_tabs(validate: bool) -> TabList {
let (temp_dir, tab_files) = TabDirectories::get_tabs();

let tabs: Vec<_> = tab_files
.into_iter()
Expand Down Expand Up @@ -50,11 +77,11 @@ pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
if tabs.is_empty() {
panic!("No tabs found");
}
(temp_dir, tabs)
TabList(tabs, temp_dir)
}

#[derive(Deserialize)]
struct TabList {
struct TabDirectories {
directories: Vec<PathBuf>,
}

Expand Down Expand Up @@ -246,9 +273,9 @@ fn is_executable(path: &Path) -> bool {
.unwrap_or(false)
}

impl TabList {
impl TabDirectories {
fn get_tabs() -> (TempDir, Vec<PathBuf>) {
let temp_dir = TempDir::new().unwrap();
let temp_dir = TempDir::with_prefix("linutil_scripts").unwrap();
TAB_DATA
.extract(&temp_dir)
.expect("Failed to extract the saved directory");
Expand Down
2 changes: 1 addition & 1 deletion core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::rc::Rc;
use ego_tree::Tree;
use std::path::PathBuf;

pub use inner::get_tabs;
pub use inner::{get_tabs, TabList};

#[derive(Clone, Hash, Eq, PartialEq)]
pub enum Command {
Expand Down
10 changes: 3 additions & 7 deletions tui/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::{
};
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use ego_tree::NodeId;
use linutil_core::{ListNode, Tab};
use linutil_core::{ListNode, TabList};
#[cfg(feature = "tips")]
use rand::Rng;
use ratatui::{
Expand All @@ -20,7 +20,6 @@ use ratatui::{
Frame,
};
use std::rc::Rc;
use temp_dir::TempDir;

const MIN_WIDTH: u16 = 100;
const MIN_HEIGHT: u16 = 25;
Expand All @@ -40,14 +39,12 @@ P* - privileged *
";

pub struct AppState {
/// This must be passed to retain the temp dir until the end of the program
_temp_dir: TempDir,
/// Selected theme
theme: Theme,
/// Currently focused area
pub focus: Focus,
/// List of tabs
tabs: Vec<Tab>,
tabs: TabList,
/// Current tab
current_tab: ListState,
/// This stack keeps track of our "current directory". You can think of it as `pwd`. but not
Expand Down Expand Up @@ -88,11 +85,10 @@ enum SelectedItem {

impl AppState {
pub fn new(theme: Theme, override_validation: bool, size_bypass: 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 mut state = Self {
_temp_dir: temp_dir,
theme,
focus: Focus::List,
tabs,
Expand Down
26 changes: 12 additions & 14 deletions xtask/src/docgen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub fn userguide() -> Result<String, DynError> {
let mut md = String::new();
md.push_str("<!-- THIS FILE IS GENERATED BY cargo xtask docgen -->\n# Walkthrough\n");

let tabs = linutil_core::get_tabs(false).1;
let tabs = linutil_core::get_tabs(false);

for tab in tabs {
#[cfg(debug_assertions)]
Expand All @@ -24,7 +24,7 @@ pub fn userguide() -> Result<String, DynError> {
#[cfg(debug_assertions)]
println!(" Directory: {}", entry.name);

if entry.name != "root".to_string() {
if entry.name != "root" {
md.push_str(&format!("\n### {}\n\n", entry.name));
}

Expand All @@ -36,18 +36,16 @@ pub fn userguide() -> Result<String, DynError> {
current_dir
));
} */ // Commenting this for now, might be a good idea later
} else {
if !entry.description.is_empty() {
#[cfg(debug_assertions)]
println!(" Entry: {}", entry.name);
#[cfg(debug_assertions)]
println!(" Description: {}", entry.description);

md.push_str(&format!("- **{}**: {}\n", entry.name, entry.description));
} /* else {
md.push_str(&format!("- **{}**\n", entry.name));
} */ // https://github.com/ChrisTitusTech/linutil/pull/753
}
} else if !entry.description.is_empty() {
#[cfg(debug_assertions)]
println!(" Entry: {}", entry.name);
#[cfg(debug_assertions)]
println!(" Description: {}", entry.description);

md.push_str(&format!("- **{}**: {}\n", entry.name, entry.description));
} /* else {
md.push_str(&format!("- **{}**\n", entry.name));
} */ // https://github.com/ChrisTitusTech/linutil/pull/753
}
}

Expand Down

0 comments on commit 6728e7e

Please sign in to comment.