Some code refactor for shells related commands (#6226)

This commit is contained in:
Justin Ma 2022-08-05 01:55:49 +08:00 committed by GitHub
parent 3b809b38e8
commit 606547ecb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 40 additions and 83 deletions

View File

@ -1,3 +1,4 @@
use super::{get_current_shell, get_shells};
use nu_engine::{current_dir, CallExt}; use nu_engine::{current_dir, CallExt};
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -62,21 +63,8 @@ impl Command for Enter {
span: call.head, span: call.head,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let mut shells = get_shells(engine_state, stack, cwd);
let mut shells = if let Some(v) = shells { let mut current_shell = get_current_shell(engine_state, stack);
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
let mut current_shell = if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
};
if current_shell + 1 > shells.len() { if current_shell + 1 > shells.len() {
shells.push(new_path.clone()); shells.push(new_path.clone());

View File

@ -1,3 +1,4 @@
use super::{get_current_shell, get_shells};
use nu_engine::{current_dir, CallExt}; use nu_engine::{current_dir, CallExt};
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -57,21 +58,8 @@ impl Command for Exit {
span: call.head, span: call.head,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let mut shells = get_shells(engine_state, stack, cwd);
let mut shells = if let Some(v) = shells { let mut current_shell = get_current_shell(engine_state, stack);
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
let mut current_shell = if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
};
shells.remove(current_shell); shells.remove(current_shell);

View File

@ -1,3 +1,4 @@
use super::get_shells;
use nu_engine::{current_dir, CallExt}; use nu_engine::{current_dir, CallExt};
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -43,14 +44,7 @@ impl Command for GotoShell {
span: call.head, span: call.head,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let shells = get_shells(engine_state, stack, cwd);
let shells = if let Some(v) = shells {
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let new_path = if let Some(v) = shells.get(new_shell.item as usize) { let new_path = if let Some(v) = shells.get(new_shell.item as usize) {
v.clone() v.clone()

View File

@ -9,5 +9,28 @@ pub use enter::Enter;
pub use exit::Exit; pub use exit::Exit;
pub use g::GotoShell; pub use g::GotoShell;
pub use n::NextShell; pub use n::NextShell;
use nu_protocol::engine::{EngineState, Stack};
use nu_protocol::Value;
pub use p::PrevShell; pub use p::PrevShell;
pub use shells_::Shells; pub use shells_::Shells;
fn get_shells(engine_state: &EngineState, stack: &mut Stack, cwd: Value) -> Vec<Value> {
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS");
let shells = if let Some(v) = shells {
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
shells
}
fn get_current_shell(engine_state: &EngineState, stack: &mut Stack) -> usize {
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
}
}

View File

@ -1,3 +1,4 @@
use super::{get_current_shell, get_shells};
use nu_engine::current_dir; use nu_engine::current_dir;
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -33,21 +34,8 @@ impl Command for NextShell {
span: call.head, span: call.head,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let shells = get_shells(engine_state, stack, cwd);
let shells = if let Some(v) = shells { let mut current_shell = get_current_shell(engine_state, stack);
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
let mut current_shell = if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
};
current_shell += 1; current_shell += 1;

View File

@ -1,3 +1,4 @@
use super::{get_current_shell, get_shells};
use nu_engine::current_dir; use nu_engine::current_dir;
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -33,21 +34,8 @@ impl Command for PrevShell {
span: call.head, span: call.head,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let shells = get_shells(engine_state, stack, cwd);
let shells = if let Some(v) = shells { let mut current_shell = get_current_shell(engine_state, stack);
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
let mut current_shell = if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
};
if current_shell == 0 { if current_shell == 0 {
current_shell = shells.len() - 1; current_shell = shells.len() - 1;

View File

@ -1,3 +1,4 @@
use super::{get_current_shell, get_shells};
use nu_engine::current_dir; use nu_engine::current_dir;
use nu_protocol::ast::Call; use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::engine::{Command, EngineState, Stack};
@ -36,21 +37,8 @@ impl Command for Shells {
span, span,
}; };
let shells = stack.get_env_var(engine_state, "NUSHELL_SHELLS"); let shells = get_shells(engine_state, stack, cwd);
let shells = if let Some(v) = shells { let current_shell = get_current_shell(engine_state, stack);
v.as_list()
.map(|x| x.to_vec())
.unwrap_or_else(|_| vec![cwd])
} else {
vec![cwd]
};
let current_shell = stack.get_env_var(engine_state, "NUSHELL_CURRENT_SHELL");
let current_shell = if let Some(v) = current_shell {
v.as_integer().unwrap_or_default() as usize
} else {
0
};
let output = shells let output = shells
.into_iter() .into_iter()