From 1c84d7ae8b7c2d7189e4d604a396506dd2608d4f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 9 Jun 2019 17:56:30 -0400 Subject: fix up cd a bit more --- src/builtins.rs | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/builtins.rs b/src/builtins.rs index f4c8c44..5c1f288 100644 --- a/src/builtins.rs +++ b/src/builtins.rs @@ -1,15 +1,35 @@ -use snafu::{ResultExt, Snafu}; +use snafu::{ensure, OptionExt, ResultExt, Snafu}; #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("unknown builtin {}", cmd))] UnknownBuiltin { cmd: String }, + #[snafu(display( + "not enough parameters for {} (got {}, expected {})", + cmd, args.len(), expected + ))] + NotEnoughParams { + cmd: String, + args: Vec, + expected: u32, + }, + + #[snafu(display( + "too many parameters for {} (got {}, expected {})", + cmd, args.len(), expected + ))] + TooManyParams { + cmd: String, + args: Vec, + expected: u32, + }, + #[snafu(display("failed to cd to {}: {}", dir, source))] Chdir { dir: String, source: nix::Error }, - #[snafu(display("cd requires a directory to be given"))] - ChdirParams, + #[snafu(display("failed to cd: $HOME not set"))] + ChdirUnknownHome, } pub fn exec(cmd: &str, args: &[String]) -> Result { @@ -63,9 +83,20 @@ impl futures::stream::Stream for Builtin { } fn cd(args: &[String]) -> Result<(), Error> { - if let Some(dir) = args.get(0) { - nix::unistd::chdir(dir.as_str()).context(Chdir { dir: dir.clone() }) + ensure!( + args.len() <= 1, + TooManyParams { + cmd: "cd", + args, + expected: 1u32, + } + ); + let dir = if let Some(dir) = args.get(0) { + std::convert::From::from(dir) } else { - Err(Error::ChdirParams) - } + std::env::var_os("HOME").context(ChdirUnknownHome)? + }; + nix::unistd::chdir(dir.as_os_str()).context(Chdir { + dir: dir.to_string_lossy(), + }) } -- cgit v1.2.3-54-g00ecf