Merge pull request #584 from androbtech/valueshell-ls

ls is aware of paths given to list when entered files/values.
This commit is contained in:
Andrés N. Robalino 2019-09-03 05:54:08 -05:00 committed by GitHub
commit a2700308a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,7 +8,7 @@ use crate::prelude::*;
use crate::shell::shell::Shell; use crate::shell::shell::Shell;
use crate::utils::ValueStructure; use crate::utils::ValueStructure;
use std::ffi::OsStr; use std::ffi::OsStr;
use std::path::PathBuf; use std::path::{Path, PathBuf};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct ValueShell { pub struct ValueShell {
@ -23,9 +23,10 @@ impl ValueShell {
value, value,
} }
} }
fn members(&self) -> VecDeque<Tagged<Value>> {
fn members_under(&self, path: &Path) -> VecDeque<Tagged<Value>> {
let mut shell_entries = VecDeque::new(); let mut shell_entries = VecDeque::new();
let full_path = PathBuf::from(&self.path); let full_path = path.to_path_buf();
let mut viewed = self.value.clone(); let mut viewed = self.value.clone();
let sep_string = std::path::MAIN_SEPARATOR.to_string(); let sep_string = std::path::MAIN_SEPARATOR.to_string();
let sep = OsStr::new(&sep_string); let sep = OsStr::new(&sep_string);
@ -54,7 +55,11 @@ impl ValueShell {
} }
} }
shell_entries shell_entries
}
fn members(&self) -> VecDeque<Tagged<Value>> {
self.members_under(Path::new("."))
} }
} }
@ -74,9 +79,37 @@ impl Shell for ValueShell {
dirs::home_dir() dirs::home_dir()
} }
fn ls(&self, _args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError> { fn ls(&self, args: EvaluatedWholeStreamCommandArgs) -> Result<OutputStream, ShellError> {
let mut full_path = PathBuf::from(self.path());
let target = args.nth(0);
match target {
Some(value) => full_path.push(Path::new(&value.as_path()?)),
_ => {}
}
let mut value_system = ValueStructure::new();
value_system.walk_decorate(&self.value)?;
if !value_system.exists(&full_path) {
if let Some(target) = target {
return Err(ShellError::labeled_error(
"Can not list entries inside",
"No such path exists",
target.span(),
));
}
return Err(ShellError::labeled_error(
"Can not list entries inside",
"No such path exists",
args.call_info.name_span,
));
}
Ok(self Ok(self
.members() .members_under(full_path.as_path())
.map(|x| ReturnSuccess::value(x)) .map(|x| ReturnSuccess::value(x))
.to_output_stream()) .to_output_stream())
} }