diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-06-09 17:56:30 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-06-09 17:56:30 -0400 |
commit | 1c84d7ae8b7c2d7189e4d604a396506dd2608d4f (patch) | |
tree | 01671ba7c464b895274cf516756f3b55c417b7f0 | |
parent | 56db51ac99466df9b6fb87cdc54cc859c200065f (diff) | |
download | nbsh-old-1c84d7ae8b7c2d7189e4d604a396506dd2608d4f.tar.gz nbsh-old-1c84d7ae8b7c2d7189e4d604a396506dd2608d4f.zip |
fix up cd a bit more
-rw-r--r-- | src/builtins.rs | 45 |
1 files 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<String>, + expected: u32, + }, + + #[snafu(display( + "too many parameters for {} (got {}, expected {})", + cmd, args.len(), expected + ))] + TooManyParams { + cmd: String, + args: Vec<String>, + 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<Builtin, Error> { @@ -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(), + }) } |