read existing fs upon startup
parent
f5c36382b6
commit
04289a4724
|
@ -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 {
|
||||||
|
|
|
@ -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(())
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![feature(io_error_more)]
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
mod command;
|
mod command;
|
||||||
mod command_output;
|
mod command_output;
|
||||||
|
|
Loading…
Reference in New Issue