read existing fs upon startup

main
nick 2024-10-03 13:15:45 -04:00
parent f5c36382b6
commit 04289a4724
3 changed files with 66 additions and 12 deletions

View File

@ -1,8 +1,9 @@
mod display; mod display;
mod item; mod item;
mod constructors;
use std::fs::{remove_dir_all, remove_file, rename, DirBuilder, File}; use std::fs::{read_dir, remove_dir_all, remove_file, rename, DirBuilder, File};
use std::io::Error; use std::io::{Error, ErrorKind};
use std::path::PathBuf; use std::path::PathBuf;
use tui::widgets::{Block, Borders, List, ListItem}; use tui::widgets::{Block, Borders, List, ListItem};
@ -23,16 +24,14 @@ pub struct Directory {
} }
impl Directory { impl Directory {
pub fn new(root: String) -> Result<Self, Error> { pub fn new(root: String) -> Result<Self, Error> {
DirBuilder::new() match read_dir(&root) {
.recursive(true) Ok(d) => constructors::new_from_existing(root, d),
.create(&root)?; Err(e) => if e.kind() == ErrorKind::NotFound {
constructors::create_new(root)
Ok(Self { } else {
dirs: vec![Item::new(root, 0, false)], Err(e)
src_name: None, }
selection: 0, }
editing: false,
})
} }
pub fn path(&self) -> PathBuf { pub fn path(&self) -> PathBuf {

View File

@ -0,0 +1,53 @@
use super::{Directory, Item};
use std::fs::{read_dir, DirBuilder, ReadDir};
use std::io::{Error, ErrorKind};
pub(super) fn create_new(root: String) -> Result<Directory, Error> {
DirBuilder::new()
.recursive(true)
.create(&root)?;
Ok(Directory {
dirs: vec![Item::new(root, 0, false)],
src_name: None,
selection: 0,
editing: false,
})
}
pub(super) fn new_from_existing(root: String, d: ReadDir) -> Result<Directory, Error> {
let mut dirs = vec![Item::new(root, 0, false)];
add_items(&mut dirs, 1, d)?;
Ok(Directory {
dirs,
src_name: None,
selection: 0,
editing: false,
})
}
fn add_items(out: &mut Vec<Item>, depth: u8, d: ReadDir) -> Result<(), Error> {
for item in d {
let item = item?;
let name = item.file_name()
.into_string()
.map_err(|_| Error::new(ErrorKind::InvalidFilename, "could not display file name"))?;
match read_dir(item.path()) {
Ok(read) => {
out.push( Item::new(name, depth, false) );
add_items(out, depth+1, read)?;
},
Err(e) => if e.kind() == ErrorKind::NotADirectory {
out.push( Item::new(name, depth, true) );
} else {
return Err(e);
}
}
}
Ok(())
}

View File

@ -1,3 +1,5 @@
#![feature(io_error_more)]
mod args; mod args;
mod command; mod command;
mod command_output; mod command_output;