summaryrefslogtreecommitdiffstats
path: root/src/poem/anthology/cd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/poem/anthology/cd.rs')
-rw-r--r--src/poem/anthology/cd.rs53
1 files changed, 42 insertions, 11 deletions
diff --git a/src/poem/anthology/cd.rs b/src/poem/anthology/cd.rs
index 5b39359..bdf04f6 100644
--- a/src/poem/anthology/cd.rs
+++ b/src/poem/anthology/cd.rs
@@ -1,5 +1,6 @@
-use crate::poem::Verse;
use std::env;
+use std::os::unix::process::ExitStatusExt;
+use std::process::{ExitStatus, Output};
/// cd
///
@@ -12,27 +13,57 @@ use std::env;
/// ```sh
/// cd ~/.config # Change into /home/<user>/.config
/// ```
-pub fn incant(verse: &Verse) -> i32 {
- let path = match verse.clause() {
+pub fn incant(clause: &Option<Vec<String>>, uerr: bool) -> Output {
+ let status;
+ let out: Vec<u8> = Vec::new();
+ let mut err: Vec<u8> = Vec::new();
+ let path = match clause {
Some(path) => path[0].to_string(),
None => match env::var("HOME") {
Ok(val) => val,
Err(_) => {
- eprintln!("cd: unknown home, staying in pwd");
- return 1;
+ status = 1;
+ if uerr {
+ err.append(&mut "cd: unknown home, staying in pwd\n".as_bytes().to_vec());
+ } else {
+ eprintln!("cd: unknown home, staying in pwd");
+ }
+ return Output {
+ status: ExitStatus::from_raw(status),
+ stdout: out,
+ stderr: err,
+ };
}
},
};
- match std::env::set_current_dir(&path) {
+ status = match std::env::set_current_dir(&path) {
Ok(_) => 0,
Err(e) => {
- eprintln!(
- "cd: unable to change into {}: {}",
- path,
- e.to_string().to_lowercase()
- );
+ if uerr {
+ err.append(
+ &mut format!(
+ "cd: unable to change into {}: {}\n",
+ path,
+ e.to_string().to_lowercase()
+ )
+ .as_bytes()
+ .to_vec(),
+ );
+ } else {
+ eprintln!(
+ "cd: unable to change into {}: {}",
+ path,
+ e.to_string().to_lowercase()
+ );
+ }
1
}
+ };
+
+ Output {
+ status: ExitStatus::from_raw(status),
+ stdout: out,
+ stderr: err,
}
}