1
0
mirror of https://github.com/rust-lang/rustlings.git synced 2024-11-08 09:09:17 +01:00

Show message on reset

This commit is contained in:
mo8it 2024-04-08 01:33:11 +02:00
parent 25e855a009
commit bd5503a0d3
3 changed files with 21 additions and 10 deletions

@ -5,7 +5,7 @@ use crossterm::{
ExecutableCommand, ExecutableCommand,
}; };
use ratatui::{backend::CrosstermBackend, Terminal}; use ratatui::{backend::CrosstermBackend, Terminal};
use std::io; use std::{fmt::Write, io};
mod state; mod state;
@ -42,6 +42,8 @@ pub fn list(state_file: &mut StateFile, exercises: &[Exercise]) -> Result<()> {
} }
}; };
ui_state.message.clear();
match key.code { match key.code {
KeyCode::Char('q') => break, KeyCode::Char('q') => break,
KeyCode::Down | KeyCode::Char('j') => ui_state.select_next(), KeyCode::Down | KeyCode::Char('j') => ui_state.select_next(),
@ -50,9 +52,14 @@ pub fn list(state_file: &mut StateFile, exercises: &[Exercise]) -> Result<()> {
KeyCode::End | KeyCode::Char('G') => ui_state.select_last(), KeyCode::End | KeyCode::Char('G') => ui_state.select_last(),
KeyCode::Char('r') => { KeyCode::Char('r') => {
let selected = ui_state.selected(); let selected = ui_state.selected();
exercises[selected].reset()?; let exercise = &exercises[selected];
exercise.reset()?;
state_file.reset(selected)?; state_file.reset(selected)?;
ui_state.table = ui_state.table.rows(UiState::rows(state_file, exercises)); ui_state.table = ui_state.table.rows(UiState::rows(state_file, exercises));
ui_state
.message
.write_fmt(format_args!("The exercise {exercise} has been reset!"))?;
} }
KeyCode::Char('c') => { KeyCode::Char('c') => {
state_file.set_next_exercise_ind(ui_state.selected())?; state_file.set_next_exercise_ind(ui_state.selected())?;

@ -10,6 +10,7 @@ use crate::{exercise::Exercise, state_file::StateFile};
pub struct UiState<'a> { pub struct UiState<'a> {
pub table: Table<'a>, pub table: Table<'a>,
pub message: String,
selected: usize, selected: usize,
table_state: TableState, table_state: TableState,
last_ind: usize, last_ind: usize,
@ -77,14 +78,13 @@ impl<'a> UiState<'a> {
.block(Block::default().borders(Borders::BOTTOM)); .block(Block::default().borders(Borders::BOTTOM));
let selected = 0; let selected = 0;
let table_state = TableState::default().with_selected(Some(selected));
let last_ind = exercises.len() - 1;
Self { Self {
table, table,
selected, selected,
table_state, table_state: TableState::default().with_selected(Some(selected)),
last_ind, last_ind: exercises.len() - 1,
message: String::with_capacity(128),
} }
} }
@ -130,10 +130,14 @@ impl<'a> UiState<'a> {
&mut self.table_state, &mut self.table_state,
); );
let help_footer = let message = if self.message.is_empty() {
"↓/j ↑/k home/g end/G │ Filter <d>one/<p>ending │ <r>eset │ <c>ontinue at │ <q>uit"; // Help footer.
"↓/j ↑/k home/g end/G │ Filter <d>one/<p>ending │ <r>eset │ <c>ontinue at │ <q>uit"
} else {
&self.message
};
frame.render_widget( frame.render_widget(
Span::raw(help_footer), Span::raw(message),
Rect { Rect {
x: 0, x: 0,
y: area.height - 1, y: area.height - 1,

@ -124,7 +124,7 @@ If you are just starting with Rustlings, run the command `rustlings init` to ini
let (ind, exercise) = find_exercise(&name, &exercises)?; let (ind, exercise) = find_exercise(&name, &exercises)?;
exercise.reset()?; exercise.reset()?;
state_file.reset(ind)?; state_file.reset(ind)?;
println!("The file {} has been reset!", exercise.path.display()); println!("The exercise {exercise} has been reset!");
} }
Some(Subcommands::Hint { name }) => { Some(Subcommands::Hint { name }) => {
let (_, exercise) = find_exercise(&name, &exercises)?; let (_, exercise) = find_exercise(&name, &exercises)?;