summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-04-12 20:06:56 +0200
committermo8it <mo8it@proton.me>2024-04-12 20:06:56 +0200
commit24539666afb0e8c80fbccbca7ad212ba8fbd1189 (patch)
treecf11a77f3506ac0adcb2c7f332e924b2300dc060
parent757723a7e8db5822df3b7ca56012448ca292ce4f (diff)
Show the final message
-rw-r--r--info.toml3
-rw-r--r--src/app_state.rs27
-rw-r--r--src/exercise.rs1
-rw-r--r--src/main.rs6
4 files changed, 23 insertions, 14 deletions
diff --git a/info.toml b/info.toml
index d35b570..b6b6800 100644
--- a/info.toml
+++ b/info.toml
@@ -20,7 +20,8 @@ started, here's a couple of notes about how Rustlings operates:
and sometimes, other learners do too so you can help each other out!
Got all that? Great! To get started, run `rustlings watch` in order to get the first exercise.
-Make sure to have your editor open in the `rustlings` directory!"""
+Make sure to have your editor open in the `rustlings` directory!
+"""
final_message = """We hope you enjoyed learning about the various aspects of Rust!
If you noticed any issues, please don't hesitate to report them to our repo.
diff --git a/src/app_state.rs b/src/app_state.rs
index cb7debe..2ea3db4 100644
--- a/src/app_state.rs
+++ b/src/app_state.rs
@@ -51,24 +51,29 @@ impl StateFile {
}
}
+#[must_use]
+pub enum ExercisesProgress {
+ AllDone,
+ Pending,
+}
+
pub struct AppState {
state_file: StateFile,
exercises: &'static [Exercise],
n_done: u16,
current_exercise: &'static Exercise,
-}
-
-#[must_use]
-pub enum ExercisesProgress {
- AllDone,
- Pending,
+ final_message: &'static str,
}
impl AppState {
- pub fn new(exercises: Vec<Exercise>) -> Self {
- // Leaking for sending the exercises to the debounce event handler.
- // Leaking is not a problem since the exercises' slice is used until the end of the program.
+ pub fn new(mut exercises: Vec<Exercise>, mut final_message: String) -> Self {
+ // Leaking especially for sending the exercises to the debounce event handler.
+ // Leaking is not a problem because the `AppState` instance lives until
+ // the end of the program.
+ exercises.shrink_to_fit();
let exercises = exercises.leak();
+ final_message.shrink_to_fit();
+ let final_message = final_message.leak();
let state_file = StateFile::read_or_default(exercises);
let n_done = state_file
@@ -82,6 +87,7 @@ impl AppState {
exercises,
n_done,
current_exercise,
+ final_message,
}
}
@@ -210,7 +216,8 @@ impl AppState {
writer.execute(Clear(ClearType::All))?;
writer.write_all(FENISH_LINE.as_bytes())?;
- // TODO: Show final message.
+ writer.write_all(self.final_message.as_bytes())?;
+ writer.write_all(b"\n")?;
return Ok(ExercisesProgress::AllDone);
};
diff --git a/src/exercise.rs b/src/exercise.rs
index a9dcce3..a29b83a 100644
--- a/src/exercise.rs
+++ b/src/exercise.rs
@@ -26,7 +26,6 @@ pub enum Mode {
pub struct InfoFile {
// TODO
pub welcome_message: Option<String>,
- // TODO
pub final_message: Option<String>,
pub exercises: Vec<Exercise>,
}
diff --git a/src/main.rs b/src/main.rs
index fdbb710..cdfa21f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -68,7 +68,7 @@ fn main() -> Result<()> {
exit(1);
}
- let mut app_state = AppState::new(exercises);
+ let mut app_state = AppState::new(exercises, info_file.final_message.unwrap_or_default());
match args.command {
None => loop {
@@ -144,4 +144,6 @@ const FENISH_LINE: &str = "+----------------------------------------------------
▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒
▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒
▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒
- ▒▒ ▒▒ ▒▒ ▒▒\x1b[0m";
+ ▒▒ ▒▒ ▒▒ ▒▒\x1b[0m
+
+";