2019-05-10 18:59:12 +02:00
|
|
|
use crate::errors::ShellError;
|
2019-06-03 09:41:28 +02:00
|
|
|
use crate::object::{dir_entry_dict, Primitive, Value};
|
2019-06-22 05:43:37 +02:00
|
|
|
use crate::parser::Spanned;
|
2019-05-13 19:30:51 +02:00
|
|
|
use crate::prelude::*;
|
2019-06-03 09:41:28 +02:00
|
|
|
use std::path::{Path, PathBuf};
|
2019-05-10 18:59:12 +02:00
|
|
|
|
2019-07-24 00:22:11 +02:00
|
|
|
pub fn ls(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputStream, ShellError> {
|
|
|
|
let env = args.env.clone();
|
|
|
|
let env = env.lock().unwrap();
|
|
|
|
let args = args.evaluate_once(registry)?;
|
2019-07-16 21:10:25 +02:00
|
|
|
let path = env.path.to_path_buf();
|
2019-06-13 23:47:25 +02:00
|
|
|
let mut full_path = PathBuf::from(path);
|
2019-06-22 05:43:37 +02:00
|
|
|
match &args.nth(0) {
|
2019-06-08 00:35:07 +02:00
|
|
|
Some(Spanned {
|
|
|
|
item: Value::Primitive(Primitive::String(s)),
|
|
|
|
..
|
2019-06-22 22:46:16 +02:00
|
|
|
}) => full_path.push(Path::new(&s)),
|
2019-06-03 09:41:28 +02:00
|
|
|
_ => {}
|
|
|
|
}
|
2019-05-11 10:08:21 +02:00
|
|
|
|
2019-07-16 21:10:25 +02:00
|
|
|
let entries = std::fs::read_dir(&full_path);
|
2019-06-08 00:35:07 +02:00
|
|
|
|
2019-07-16 21:10:25 +02:00
|
|
|
let entries = match entries {
|
|
|
|
Err(e) => {
|
|
|
|
if let Some(s) = args.nth(0) {
|
|
|
|
return Err(ShellError::labeled_error(
|
|
|
|
e.to_string(),
|
|
|
|
e.to_string(),
|
|
|
|
s.span,
|
|
|
|
));
|
|
|
|
} else {
|
|
|
|
return Err(ShellError::maybe_labeled_error(
|
|
|
|
e.to_string(),
|
|
|
|
e.to_string(),
|
2019-07-24 00:22:11 +02:00
|
|
|
args.name_span(),
|
2019-07-16 21:10:25 +02:00
|
|
|
));
|
2019-06-13 23:47:25 +02:00
|
|
|
}
|
|
|
|
}
|
2019-07-16 21:10:25 +02:00
|
|
|
Ok(o) => o,
|
|
|
|
};
|
2019-06-14 03:59:13 +02:00
|
|
|
|
2019-07-16 21:10:25 +02:00
|
|
|
let mut shell_entries = VecDeque::new();
|
|
|
|
|
|
|
|
for entry in entries {
|
2019-07-24 00:22:11 +02:00
|
|
|
let value = dir_entry_dict(&entry?, args.name_span())?;
|
2019-07-16 21:10:25 +02:00
|
|
|
shell_entries.push_back(ReturnSuccess::value(value))
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|
2019-07-16 21:10:25 +02:00
|
|
|
Ok(shell_entries.to_output_stream())
|
2019-05-10 18:59:12 +02:00
|
|
|
}
|