From db1ccc63a58f607ab367fc9e859e78ccbb8fd6fb Mon Sep 17 00:00:00 2001 From: Ryuichi Ueda Date: Mon, 1 Jan 2024 00:02:17 +0900 Subject: [PATCH] Refactor --- src/core/builtins/cd.rs | 49 +++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/core/builtins/cd.rs b/src/core/builtins/cd.rs index 482523fc..6a1dbc45 100644 --- a/src/core/builtins/cd.rs +++ b/src/core/builtins/cd.rs @@ -5,26 +5,33 @@ use crate::ShellCore; use super::utils; -pub fn cd(core: &mut ShellCore, args: &mut Vec) -> i32 { - if args.len() > 2 { - eprintln!("sush: cd: too many arguments"); +fn cd_1arg(core: &mut ShellCore, args: &mut Vec) -> i32 { + let var = "~".to_string(); + args.push(var); + set_oldpwd(core); + change_directory(core, args) +} + +fn cd_oldpwd(core: &mut ShellCore, args: &mut Vec) -> i32 { + if let Some(old) = core.vars.get("OLDPWD") { + println!("{}", &old); + args[1] = old.to_string(); + }else { + eprintln!("sush: cd: OLDPWD not set"); return 1; } - if args.len() == 1 { //only "cd" - let var = "~".to_string(); - args.push(var); - }else if args.len() == 2 && args[1] == "-" { // cd - - if let Some(old) = core.vars.get("OLDPWD") { - println!("{}", &old); - args[1] = old.to_string(); - } - }; + set_oldpwd(core); + change_directory(core, args) +} +fn set_oldpwd(core: &mut ShellCore) { if let Some(old) = core.get_current_directory().clone() { core.vars.insert("OLDPWD".to_string(), old.display().to_string()); }; +} +fn change_directory(core: &mut ShellCore, args: &mut Vec) -> i32 { let path = utils::make_canonical_path(utils::make_absolute_path(core, &args[1])); if core.set_current_directory(&path).is_ok() { core.vars.insert("PWD".to_string(), path.display().to_string()); @@ -34,3 +41,21 @@ pub fn cd(core: &mut ShellCore, args: &mut Vec) -> i32 { 1 } } + +pub fn cd(core: &mut ShellCore, args: &mut Vec) -> i32 { + if args.len() > 2 { + eprintln!("sush: cd: too many arguments"); + return 1; + } + + if args.len() == 1 { //only "cd" + return cd_1arg(core, args); + } + + if args[1] == "-" { // cd - + cd_oldpwd(core, args) + }else{ // cd /some/dir + set_oldpwd(core); + change_directory(core, args) + } +}