Add which command

This commit is contained in:
Jonathan Turner 2019-08-10 19:06:08 +12:00
parent 1662824a5c
commit c97578bf6e
3 changed files with 73 additions and 0 deletions

View File

@ -191,6 +191,7 @@ pub async fn cli() -> Result<(), Box<dyn Error>> {
static_command(Save),
static_command(Table),
static_command(VTable),
static_command(Which),
]);
}
let _ = load_plugins(&mut context);

View File

@ -48,6 +48,7 @@ crate mod to_yaml;
crate mod trim;
crate mod vtable;
crate mod where_;
crate mod which_;
crate use autoview::Autoview;
//crate use cd::Cd;
@ -69,3 +70,4 @@ crate use skip_while::SkipWhile;
crate use table::Table;
crate use vtable::VTable;
crate use where_::Where;
crate use which_::Which;

70
src/commands/which_.rs Normal file
View File

@ -0,0 +1,70 @@
use crate::errors::ShellError;
use crate::object::Value;
use crate::prelude::*;
use crate::commands::StaticCommand;
use crate::parser::registry::Signature;
pub struct Which;
impl StaticCommand for Which {
fn run(
&self,
args: CommandArgs,
registry: &CommandRegistry,
) -> Result<OutputStream, ShellError> {
which(args, registry)
}
fn name(&self) -> &str {
"which"
}
fn signature(&self) -> Signature {
Signature::build("which").required("name", SyntaxType::Any)
}
}
pub fn which(args: CommandArgs, registry: &CommandRegistry) -> Result<OutputStream, ShellError> {
let args = args.evaluate_once(registry)?;
let mut which_out = VecDeque::new();
let span = args.call_info.name_span;
if let Some(v) = &args.call_info.args.positional {
if v.len() > 0 {
match &v[0] {
Tagged {
item: Value::Primitive(Primitive::String(s)),
tag,
} => match which::which(&s) {
Ok(ok) => {
which_out
.push_back(Value::Primitive(Primitive::Path(ok)).tagged(tag.clone()));
}
_ => {}
},
Tagged { tag, .. } => {
return Err(ShellError::labeled_error(
"Expected a filename to find",
"needs a filename",
tag.span,
));
}
}
} else {
return Err(ShellError::labeled_error(
"Expected a binary to find",
"needs application name",
span,
));
}
} else {
return Err(ShellError::labeled_error(
"Expected a binary to find",
"needs application name",
span,
));
}
Ok(which_out.to_output_stream())
}