aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-06-09 17:56:30 -0400
committerJesse Luehrs <doy@tozt.net>2019-06-09 17:56:30 -0400
commit1c84d7ae8b7c2d7189e4d604a396506dd2608d4f (patch)
tree01671ba7c464b895274cf516756f3b55c417b7f0
parent56db51ac99466df9b6fb87cdc54cc859c200065f (diff)
downloadnbsh-old-1c84d7ae8b7c2d7189e4d604a396506dd2608d4f.tar.gz
nbsh-old-1c84d7ae8b7c2d7189e4d604a396506dd2608d4f.zip
fix up cd a bit more
-rw-r--r--src/builtins.rs45
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(),
+ })
}