mirror of
https://github.com/nushell/nushell.git
synced 2025-05-18 17:00:46 +02:00
improve factoring
This commit is contained in:
parent
fb75e16375
commit
6e78f36075
@ -56,53 +56,40 @@ impl Command for Input {
|
||||
call: &Call,
|
||||
_input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let prompt_str: Option<String> = call.opt(engine_state, stack, 0)?;
|
||||
let bytes_until: Option<String> = call.get_flag(engine_state, stack, "bytes-until-any")?;
|
||||
let suppress_output = call.has_flag(engine_state, stack, "suppress-output")?;
|
||||
let numchar_flag: Option<Spanned<i64>> = call.get_flag(engine_state, stack, "numchar")?;
|
||||
let numchar: Spanned<i64> = numchar_flag.unwrap_or(Spanned {
|
||||
item: i64::MAX,
|
||||
span: call.head,
|
||||
});
|
||||
|
||||
let from_io_error = IoError::factory(call.head, None);
|
||||
|
||||
if numchar.item < 1 {
|
||||
return Err(ShellError::UnsupportedInput {
|
||||
msg: "Number of characters to read has to be positive".to_string(),
|
||||
input: "value originated from here".to_string(),
|
||||
msg_span: call.head,
|
||||
input_span: numchar.span,
|
||||
});
|
||||
}
|
||||
|
||||
// Those 2 options are not supported by reedline, default to the legacy
|
||||
// Those options are not supported by reedline, default to the legacy
|
||||
// implementation
|
||||
if suppress_output || bytes_until.is_some() || numchar_flag.is_some() {
|
||||
let use_legacy = [
|
||||
call.get_flag::<String>(engine_state, stack, "bytes-until-any")?
|
||||
.is_some(),
|
||||
call.has_flag(engine_state, stack, "suppress-output")?,
|
||||
call.get_flag::<Spanned<i64>>(engine_state, stack, "numchar")?
|
||||
.is_some(),
|
||||
]
|
||||
.iter()
|
||||
.any(|x| *x);
|
||||
|
||||
if use_legacy {
|
||||
return self.legacy_input(engine_state, stack, call, _input);
|
||||
}
|
||||
|
||||
// Here we will render the default prompt to the right
|
||||
let prompt_str: Option<String> = call.opt(engine_state, stack, 0)?;
|
||||
let default_val: Option<String> = call.get_flag(engine_state, stack, "default")?;
|
||||
|
||||
let from_io_error = IoError::factory(call.head, None);
|
||||
|
||||
let default_str = match (&prompt_str, &default_val) {
|
||||
(Some(_prompt), Some(val)) => format!("(default: {val}) ").to_string(),
|
||||
(Some(_prompt), Some(val)) => format!("(default: {val}) "),
|
||||
_ => "".to_string(),
|
||||
};
|
||||
let mut buf = String::new();
|
||||
let prompt = ReedlinePrompt {
|
||||
// Put the default value in the indicator for now.
|
||||
indicator: default_str,
|
||||
left_prompt: prompt_str.unwrap_or("".to_string()),
|
||||
// Breaking change, the default is now in the right prompt
|
||||
right_prompt: "".to_string(),
|
||||
};
|
||||
let mut line_editor = Reedline::create();
|
||||
// Disable ansi colors for now, for backwards compat. This will be configurable in the
|
||||
// future
|
||||
line_editor = line_editor.with_ansi_colors(false);
|
||||
|
||||
// TODO handle options
|
||||
|
||||
let mut buf = String::new();
|
||||
loop {
|
||||
match line_editor.read_line(&prompt) {
|
||||
Ok(Signal::Success(buffer)) => {
|
||||
|
Loading…
Reference in New Issue
Block a user