Change rendering of the default value in input, int and float
Earlier, the default value would just be shown on the side at all times. This is even if the default will not be selected which can be misleading. This change shows the default as greyed out text in the input itself. It also allows pressing 'Tab' to make the current input the default if the current input value is the start of the default. Implements #4
This commit is contained in:
parent
1d5fadad23
commit
911dd36aad
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m 3[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 3[38;5;0m[48;5;8m.[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m s[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m s[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m [38;5;6mdefault[39m │
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m │
|
||||
│[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
|
|
28
crossterm-snapshots/input__helpers__default-7.snap
Normal file
28
crossterm-snapshots/input__helpers__default-7.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
28
crossterm-snapshots/input__helpers__default-8.snap
Normal file
28
crossterm-snapshots/input__helpers__default-8.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m default[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
28
crossterm-snapshots/input__helpers__default-9.snap
Normal file
28
crossterm-snapshots/input__helpers__default-9.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m [38;5;6mdefault[39m │
|
||||
│[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m 3[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 3[38;5;0m[48;5;8m2[39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/input.rs
|
||||
source: src/question/input/tests.rs
|
||||
assertion_line: 57
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8mdefault[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/input.rs
|
||||
source: src/question/input/tests.rs
|
||||
assertion_line: 66
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m inputinputinputinputinput│
|
||||
│inputinputinputinputinput[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m inputinputinputinputinputinputinp│
|
||||
│utinputinputinput[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 100
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(3.3)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8m3.3[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 100
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(3.3)[39m 33333333333333333333333333333│
|
||||
│333333333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 333333333333333333333333333333333│
|
||||
│33333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 99
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(333)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8m333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 99
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(333)[39m 33333333333333333333333333333│
|
||||
│333333333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 333333333333333333333333333333333│
|
||||
│33333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
fn main() {
|
||||
let question = requestty::Question::int("age")
|
||||
.message("What is your age?")
|
||||
.default(69)
|
||||
.validate_on_key(|age, _| age > 0 && age < 130)
|
||||
.validate(|age, _| {
|
||||
if age > 0 && age < 130 {
|
||||
|
|
|
@ -64,7 +64,7 @@ pub trait Widget {
|
|||
fn handle_key(&mut self, key: KeyEvent) -> bool;
|
||||
}
|
||||
|
||||
impl<T: std::ops::Deref<Target = str>> Widget for T {
|
||||
impl<T: std::ops::Deref<Target = str> + ?Sized> Widget for T {
|
||||
/// Does not allow multi-line strings. If the string requires more than a single line, it adds
|
||||
/// cuts it short and adds '...' to the end.
|
||||
///
|
||||
|
|
16
src/main.rs
Normal file
16
src/main.rs
Normal file
|
@ -0,0 +1,16 @@
|
|||
fn main() {
|
||||
let question = requestty::Question::int("age")
|
||||
.default(69)
|
||||
.message("What is your age?")
|
||||
.validate_on_key(|age, _| age > 0 && age < 130)
|
||||
.validate(|age, _| {
|
||||
if age > 0 && age < 130 {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(format!("You cannot be {} years old!", age))
|
||||
}
|
||||
})
|
||||
.build();
|
||||
|
||||
println!("{:#?}", requestty::prompt_one(question));
|
||||
}
|
|
@ -96,7 +96,9 @@ impl<'a> InputBuilder<'a> {
|
|||
/// .build();
|
||||
/// ```
|
||||
pub fn default<I: Into<String>>(mut self, default: I) -> Self {
|
||||
self.input.default = Some(default.into());
|
||||
let default = default.into();
|
||||
let len = default.chars().count();
|
||||
self.input.default = Some((default, len));
|
||||
self
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ mod tests;
|
|||
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Input<'a> {
|
||||
default: Option<String>,
|
||||
default: Option<(String, usize)>,
|
||||
filter: Filter<'a, String>,
|
||||
validate: Validate<'a, str>,
|
||||
validate_on_key: ValidateOnKey<'a, str>,
|
||||
|
@ -81,10 +81,25 @@ impl InputPrompt<'_, '_> {
|
|||
|
||||
res
|
||||
}
|
||||
|
||||
/// Returns the remaining default text if the current input is a substring of it
|
||||
fn get_remaining_default(&self) -> Option<&str> {
|
||||
if self.select.is_none() {
|
||||
if let Some((ref default, _)) = self.input_opts.default {
|
||||
let input = self.input.value();
|
||||
if default.starts_with(self.input.value()) {
|
||||
return Some(&default[input.len()..]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl Widget for InputPrompt<'_, '_> {
|
||||
fn render<B: Backend>(&mut self, layout: &mut ui::layout::Layout, b: &mut B) -> io::Result<()> {
|
||||
let mut original_layout = *layout;
|
||||
self.prompt.render(layout, b)?;
|
||||
|
||||
// if the current input does not satisfy the on key validation, then we show its wrong by
|
||||
|
@ -97,13 +112,43 @@ impl Widget for InputPrompt<'_, '_> {
|
|||
b.set_fg(ui::style::Color::Reset)?;
|
||||
}
|
||||
|
||||
self.maybe_select_op(|select| select.render(layout, b))
|
||||
.transpose()?;
|
||||
if let Some(default) = self.get_remaining_default() {
|
||||
b.set_fg(ui::style::Color::DarkGrey)?;
|
||||
write!(b, "{}", default)?;
|
||||
b.set_fg(ui::style::Color::Reset)?;
|
||||
// We need to update the layout to reflect the rest of the hint that is rendered.
|
||||
// Instead of doing the math to compute where the cursor ends after rendering, we use
|
||||
// the height function which already calculates it.
|
||||
self.height(&mut original_layout);
|
||||
*layout = original_layout;
|
||||
} else {
|
||||
self.maybe_select_op(|select| select.render(layout, b))
|
||||
.transpose()?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn height(&mut self, layout: &mut ui::layout::Layout) -> u16 {
|
||||
let mut height = self.prompt.height(layout) + self.input.height(layout) - 1;
|
||||
let mut height = self.prompt.height(layout) - 1;
|
||||
|
||||
if self.get_remaining_default().is_some() {
|
||||
let mut width = self.input_opts.default.as_ref().unwrap().1 as u16;
|
||||
|
||||
if width > layout.line_width() {
|
||||
width -= layout.line_width();
|
||||
|
||||
layout.line_offset = width % layout.width;
|
||||
layout.offset_y += 1 + width / layout.width;
|
||||
|
||||
height += 2 + width / layout.width;
|
||||
} else {
|
||||
layout.line_offset += width;
|
||||
height += 1;
|
||||
}
|
||||
} else {
|
||||
height = self.input.height(layout);
|
||||
}
|
||||
|
||||
if let Some(picker_height) = self.maybe_select_op(|select| select.height(layout)) {
|
||||
height += picker_height - 1;
|
||||
|
@ -112,21 +157,20 @@ impl Widget for InputPrompt<'_, '_> {
|
|||
}
|
||||
|
||||
fn handle_key(&mut self, mut key: KeyEvent) -> bool {
|
||||
let Self {
|
||||
answers,
|
||||
input_opts,
|
||||
input,
|
||||
select,
|
||||
..
|
||||
} = self;
|
||||
|
||||
match input_opts.auto_complete {
|
||||
AutoComplete::Sync(ref mut ac) if key.code == KeyCode::Tab => {
|
||||
if select.is_some() {
|
||||
if key.code == KeyCode::Tab {
|
||||
if let AutoComplete::Sync(ref mut ac) = self.input_opts.auto_complete {
|
||||
if self.select.is_some() {
|
||||
key.code = KeyCode::Down;
|
||||
} else {
|
||||
let page_size = input_opts.page_size;
|
||||
let should_loop = input_opts.should_loop;
|
||||
let page_size = self.input_opts.page_size;
|
||||
let should_loop = self.input_opts.should_loop;
|
||||
|
||||
let Self {
|
||||
input,
|
||||
answers,
|
||||
select,
|
||||
..
|
||||
} = self;
|
||||
|
||||
input.replace_with(|s| {
|
||||
let mut completions = ac(s, answers);
|
||||
|
@ -148,16 +192,21 @@ impl Widget for InputPrompt<'_, '_> {
|
|||
});
|
||||
return true;
|
||||
}
|
||||
} else if self.get_remaining_default().is_some() {
|
||||
let (default, default_len) = self.input_opts.default.as_ref().unwrap();
|
||||
self.input.set_value(default.clone());
|
||||
self.input.set_at(*default_len);
|
||||
self.is_valid = true;
|
||||
return true;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if input.handle_key(key) {
|
||||
if self.input.handle_key(key) {
|
||||
if let ValidateOnKey::Sync(ref mut validate) = self.input_opts.validate_on_key {
|
||||
self.is_valid = validate(self.input.value(), self.answers);
|
||||
}
|
||||
|
||||
*select = None;
|
||||
self.select = None;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -208,13 +257,9 @@ impl Prompt for InputPrompt<'_, '_> {
|
|||
}
|
||||
|
||||
impl<'i> Input<'i> {
|
||||
fn into_input_prompt<'a>(
|
||||
mut self,
|
||||
message: &'a str,
|
||||
answers: &'a Answers,
|
||||
) -> InputPrompt<'i, 'a> {
|
||||
fn into_input_prompt<'a>(self, message: &'a str, answers: &'a Answers) -> InputPrompt<'i, 'a> {
|
||||
InputPrompt {
|
||||
prompt: widgets::Prompt::new(message).with_optional_hint(self.default.take()),
|
||||
prompt: widgets::Prompt::new(message),
|
||||
input_opts: self,
|
||||
input: widgets::StringInput::default(),
|
||||
select: None,
|
||||
|
|
|
@ -12,11 +12,11 @@ fn inputs(answers: &Answers) -> [(InputPrompt<'static, '_>, u16); NINPUTS] {
|
|||
(Input::default().into_input_prompt("message", &answers), 17),
|
||||
(
|
||||
Input {
|
||||
default: Some("default".into()),
|
||||
default: Some(("default".into(), 7)),
|
||||
..Input::default()
|
||||
}
|
||||
.into_input_prompt("message", &answers),
|
||||
25,
|
||||
24,
|
||||
),
|
||||
(
|
||||
Input {
|
||||
|
@ -54,18 +54,15 @@ fn test_render() {
|
|||
let mut layout = base_layout;
|
||||
backend.reset_with_layout(layout);
|
||||
assert!(prompt.render(&mut layout, &mut backend).is_ok());
|
||||
assert_eq!(layout, base_layout.with_line_offset(line_offset));
|
||||
ui::assert_backend_snapshot!(format!("{}-1", INPUT_IDS[i]), backend);
|
||||
assert_eq!(layout, base_layout.with_line_offset(line_offset));
|
||||
|
||||
prompt.input.set_value("input".repeat(10));
|
||||
|
||||
layout = base_layout;
|
||||
backend.reset_with_layout(layout);
|
||||
assert!(prompt.render(&mut layout, &mut backend).is_ok());
|
||||
assert_eq!(
|
||||
layout,
|
||||
base_layout.with_offset(0, 1).with_line_offset(line_offset)
|
||||
);
|
||||
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
|
||||
ui::assert_backend_snapshot!(format!("{}-2", INPUT_IDS[i]), backend);
|
||||
}
|
||||
|
||||
|
@ -117,10 +114,7 @@ fn test_height() {
|
|||
|
||||
layout = base_layout;
|
||||
assert_eq!(prompt.height(&mut layout), 2);
|
||||
assert_eq!(
|
||||
layout,
|
||||
base_layout.with_offset(0, 1).with_line_offset(line_offset)
|
||||
);
|
||||
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
|
||||
}
|
||||
|
||||
let prompt = &mut inputs[AUTO_COMPLETE_IDX].0;
|
||||
|
@ -156,13 +150,11 @@ fn test_cursor_pos() {
|
|||
|
||||
let mut inputs = inputs(&answers);
|
||||
|
||||
for (prompt, line_offset) in inputs.iter_mut() {
|
||||
let line_offset = *line_offset;
|
||||
|
||||
assert_eq!(prompt.cursor_pos(layout), (line_offset, 0));
|
||||
for (prompt, _) in inputs.iter_mut() {
|
||||
assert_eq!(prompt.cursor_pos(layout), (17, 0));
|
||||
prompt.input.set_value("input".repeat(10));
|
||||
prompt.input.set_at(50);
|
||||
assert_eq!(prompt.cursor_pos(layout), (line_offset, 1));
|
||||
assert_eq!(prompt.cursor_pos(layout), (17, 1));
|
||||
}
|
||||
|
||||
let prompt = &mut inputs[AUTO_COMPLETE_IDX].0;
|
||||
|
|
|
@ -80,7 +80,9 @@ macro_rules! builder {
|
|||
/// .build();
|
||||
/// ```
|
||||
pub fn default(mut self, default: $inner_ty) -> Self {
|
||||
self.inner.default = Some(default);
|
||||
let default_str = default.to_string();
|
||||
assert!(default_str.is_ascii());
|
||||
self.inner.default = Some((default, default_str));
|
||||
self
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ mod tests;
|
|||
|
||||
#[derive(Debug, Default)]
|
||||
pub(super) struct Float<'a> {
|
||||
default: Option<f64>,
|
||||
default: Option<(f64, String)>,
|
||||
filter: Filter<'a, f64>,
|
||||
validate: Validate<'a, f64>,
|
||||
validate_on_key: ValidateOnKey<'a, f64>,
|
||||
|
@ -33,7 +33,7 @@ pub(super) struct Float<'a> {
|
|||
|
||||
#[derive(Debug, Default)]
|
||||
pub(super) struct Int<'a> {
|
||||
default: Option<i64>,
|
||||
default: Option<(i64, String)>,
|
||||
filter: Filter<'a, i64>,
|
||||
validate: Validate<'a, i64>,
|
||||
validate_on_key: ValidateOnKey<'a, i64>,
|
||||
|
@ -102,6 +102,17 @@ macro_rules! impl_number_prompt {
|
|||
.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
fn get_remaining_default(&self) -> Option<&str> {
|
||||
if let Some((_, ref default)) = self.number.default {
|
||||
let input = self.input.value();
|
||||
if default.starts_with(self.input.value()) {
|
||||
return Some(&default[input.len()..]);
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn validate_on_key(&mut self, n: $inner_ty) {
|
||||
if let ValidateOnKey::Sync(ref mut validate) = self.number.validate_on_key {
|
||||
self.is_valid = validate(n, self.answers);
|
||||
|
@ -117,6 +128,7 @@ macro_rules! impl_number_prompt {
|
|||
layout: &mut ui::layout::Layout,
|
||||
b: &mut B,
|
||||
) -> io::Result<()> {
|
||||
let mut original_layout = *layout;
|
||||
self.prompt.render(layout, b)?;
|
||||
|
||||
// if the current input does not satisfy the on key validation, then we show its wrong by
|
||||
|
@ -129,14 +141,53 @@ macro_rules! impl_number_prompt {
|
|||
b.set_fg(ui::style::Color::Reset)?;
|
||||
}
|
||||
|
||||
if let Some(default) = self.get_remaining_default() {
|
||||
b.set_fg(ui::style::Color::DarkGrey)?;
|
||||
write!(b, "{}", default)?;
|
||||
b.set_fg(ui::style::Color::Reset)?;
|
||||
// We need to update the layout to reflect the rest of the hint that is
|
||||
// rendered. Instead of doing the math to compute where the cursor ends after
|
||||
// rendering, we use the height function which already calculates it.
|
||||
self.height(&mut original_layout);
|
||||
*layout = original_layout;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn height(&mut self, layout: &mut ui::layout::Layout) -> u16 {
|
||||
self.prompt.height(layout) + self.input.height(layout) - 1
|
||||
let mut height = self.prompt.height(layout) - 1;
|
||||
|
||||
if self.get_remaining_default().is_some() {
|
||||
let mut width = self.number.default.as_ref().unwrap().1.len() as u16;
|
||||
|
||||
if width > layout.line_width() {
|
||||
width -= layout.line_width();
|
||||
|
||||
layout.line_offset = width % layout.width;
|
||||
layout.offset_y += 1 + width / layout.width;
|
||||
|
||||
height += 2 + width / layout.width;
|
||||
} else {
|
||||
layout.line_offset += width;
|
||||
height += 1;
|
||||
}
|
||||
} else {
|
||||
height = self.input.height(layout);
|
||||
}
|
||||
|
||||
height
|
||||
}
|
||||
|
||||
fn handle_key(&mut self, key: KeyEvent) -> bool {
|
||||
if self.get_remaining_default().is_some() && key.code == KeyCode::Tab {
|
||||
let default = &self.number.default.as_ref().unwrap().1;
|
||||
self.input.set_value(default.clone());
|
||||
self.input.set_at(default.len());
|
||||
self.is_valid = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if self.input.handle_key(key) {
|
||||
match self.parse() {
|
||||
Ok(n) => self.validate_on_key(n),
|
||||
|
@ -190,7 +241,7 @@ macro_rules! impl_number_prompt {
|
|||
|
||||
fn finish(self) -> Self::Output {
|
||||
let n = match self.number.default {
|
||||
Some(default) if self.input.value().is_empty() => default,
|
||||
Some((default, _)) if self.input.value().is_empty() => default,
|
||||
_ => self
|
||||
.parse()
|
||||
.expect("Validation would fail if number cannot be parsed"),
|
||||
|
@ -217,8 +268,7 @@ macro_rules! impl_ask {
|
|||
answers: &'a Answers,
|
||||
) -> $prompt_name<'n, 'a> {
|
||||
$prompt_name {
|
||||
prompt: widgets::Prompt::new(message)
|
||||
.with_optional_hint(self.default.as_ref().map(ToString::to_string)),
|
||||
prompt: widgets::Prompt::new(message),
|
||||
input: widgets::StringInput::with_filter_map(Self::filter_map),
|
||||
is_valid: true,
|
||||
number: self,
|
||||
|
|
|
@ -14,13 +14,13 @@ macro_rules! test_numbers {
|
|||
let base_layout = Layout::new(5, size);
|
||||
let answers = Answers::default();
|
||||
|
||||
let defaults = [(None, 17), (Some($default), 21)];
|
||||
let defaults = [(None, 17), (Some($default), 20)];
|
||||
|
||||
let mut backend = TestBackend::new_with_layout(size, base_layout);
|
||||
|
||||
for &(default, line_offset) in defaults.iter() {
|
||||
let mut prompt = $prompt_name {
|
||||
default,
|
||||
default: default.map(|n| (n, n.to_string())),
|
||||
..Default::default()
|
||||
}
|
||||
.into_prompt("message", &answers);
|
||||
|
@ -38,10 +38,7 @@ macro_rules! test_numbers {
|
|||
layout = base_layout;
|
||||
backend.reset_with_layout(layout);
|
||||
assert!(prompt.render(&mut layout, &mut backend).is_ok());
|
||||
assert_eq!(
|
||||
layout,
|
||||
base_layout.with_offset(0, 1).with_line_offset(line_offset)
|
||||
);
|
||||
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
|
||||
ui::assert_backend_snapshot!(format!("{}-2", base_name), backend);
|
||||
}
|
||||
}
|
||||
|
@ -52,11 +49,11 @@ macro_rules! test_numbers {
|
|||
let base_layout = Layout::new(5, size);
|
||||
let answers = Answers::default();
|
||||
|
||||
let defaults = [(None, 17), (Some($default), 21)];
|
||||
let defaults = [(None, 17), (Some($default), 20)];
|
||||
|
||||
for &(default, line_offset) in defaults.iter() {
|
||||
let mut prompt = $prompt_name {
|
||||
default,
|
||||
default: default.map(|n| (n, n.to_string())),
|
||||
..Default::default()
|
||||
}
|
||||
.into_prompt("message", &answers);
|
||||
|
@ -69,10 +66,7 @@ macro_rules! test_numbers {
|
|||
|
||||
prompt.input.set_value("3".repeat(50));
|
||||
assert_eq!(prompt.height(&mut layout), 2);
|
||||
assert_eq!(
|
||||
layout,
|
||||
base_layout.with_offset(0, 1).with_line_offset(line_offset)
|
||||
);
|
||||
assert_eq!(layout, base_layout.with_offset(0, 1).with_line_offset(17));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,20 +76,20 @@ macro_rules! test_numbers {
|
|||
let layout = Layout::new(5, size);
|
||||
let answers = Answers::default();
|
||||
|
||||
let defaults = [(None, 17), (Some($default), 21)];
|
||||
let defaults = [None, Some($default)];
|
||||
|
||||
for &(default, line_offset) in defaults.iter() {
|
||||
for default in defaults {
|
||||
let mut prompt = $prompt_name {
|
||||
default,
|
||||
default: default.map(|n| (n, n.to_string())),
|
||||
..Default::default()
|
||||
}
|
||||
.into_prompt("message", &answers);
|
||||
|
||||
assert_eq!(prompt.cursor_pos(layout), (line_offset, 0));
|
||||
assert_eq!(prompt.cursor_pos(layout), (17, 0));
|
||||
|
||||
prompt.input.set_value("3".repeat(50));
|
||||
prompt.input.set_at(50);
|
||||
assert_eq!(prompt.cursor_pos(layout), (line_offset, 1));
|
||||
assert_eq!(prompt.cursor_pos(layout), (17, 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m 3[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 3[38;5;0m[48;5;8m.[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(3.2)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m.2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m s[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m s[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m [38;5;6mdefault[39m │
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m │
|
||||
│[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
|
|
28
termion-snapshots/input__helpers__default-7.snap
Normal file
28
termion-snapshots/input__helpers__default-7.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
28
termion-snapshots/input__helpers__default-8.snap
Normal file
28
termion-snapshots/input__helpers__default-8.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m default[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
28
termion-snapshots/input__helpers__default-9.snap
Normal file
28
termion-snapshots/input__helpers__default-9.snap
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m✔[39m [1mmessage[22m [38;5;8m·[39m [38;5;6mdefault[39m │
|
||||
│[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────┘
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8md[38;5;8m[49mefault[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m 3[38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 3[38;5;0m[48;5;8m2[39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: tests/helpers/mod.rs
|
||||
assertion_line: 31
|
||||
expression: self.backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m(32)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│[38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;0m[48;5;8m3[38;5;8m[49m2[39m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/input.rs
|
||||
source: src/question/input/tests.rs
|
||||
assertion_line: 57
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8mdefault[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/input.rs
|
||||
source: src/question/input/tests.rs
|
||||
assertion_line: 66
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(default)[39m inputinputinputinputinput│
|
||||
│inputinputinputinputinput[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m inputinputinputinputinputinputinp│
|
||||
│utinputinputinput[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 100
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(3.3)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8m3.3[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 100
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(3.3)[39m 33333333333333333333333333333│
|
||||
│333333333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 333333333333333333333333333333333│
|
||||
│33333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 99
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(333)[39m [38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m [38;5;8m333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
---
|
||||
source: src/question/number.rs
|
||||
source: src/question/number/tests.rs
|
||||
assertion_line: 99
|
||||
expression: backend
|
||||
|
||||
---
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m(333)[39m 33333333333333333333333333333│
|
||||
│333333333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ [38;5;10m? [1m[39mmessage[22m [38;5;8m›[39m 333333333333333333333333333333333│
|
||||
│33333333333333333[38;5;0m[48;5;7m [39m[49m │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
|
|
|
@ -120,6 +120,16 @@ fn test_default() {
|
|||
let mut backend = helpers::SnapshotOnFlushBackend::new((50, 20).into());
|
||||
let mut events = TestEvents::new(Some(KeyCode::Enter.into()));
|
||||
|
||||
let ans = requestty::prompt_one_with(prompt, &mut backend, &mut events).unwrap();
|
||||
assert_eq!(ans, Answer::String("".into()));
|
||||
|
||||
let prompt = Question::input("name")
|
||||
.message("message")
|
||||
.default("default");
|
||||
|
||||
let mut backend = helpers::SnapshotOnFlushBackend::new((50, 20).into());
|
||||
let mut events = TestEvents::new([KeyCode::Tab.into(), KeyCode::Enter.into()]);
|
||||
|
||||
let ans = requestty::prompt_one_with(prompt, &mut backend, &mut events).unwrap();
|
||||
assert_eq!(ans, Answer::String("default".into()));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user