summaryrefslogtreecommitdiff
path: root/src/app_state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app_state.rs')
-rw-r--r--src/app_state.rs27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/app_state.rs b/src/app_state.rs
index 381aaf8..7123d11 100644
--- a/src/app_state.rs
+++ b/src/app_state.rs
@@ -3,7 +3,7 @@ use std::{
env,
fs::{File, OpenOptions},
io::{self, Read, Seek, StdoutLock, Write},
- path::Path,
+ path::{Path, MAIN_SEPARATOR_STR},
process::{Command, Stdio},
thread,
};
@@ -15,6 +15,7 @@ use crate::{
embedded::EMBEDDED_FILES,
exercise::{Exercise, RunnableExercise},
info_file::ExerciseInfo,
+ term,
};
const STATE_FILE_NAME: &str = ".rustlings-state.txt";
@@ -71,6 +72,7 @@ impl AppState {
format!("Failed to open or create the state file {STATE_FILE_NAME}")
})?;
+ let dir_canonical_path = term::canonicalize("exercises");
let mut exercises = exercise_infos
.into_iter()
.map(|exercise_info| {
@@ -82,10 +84,32 @@ impl AppState {
let dir = exercise_info.dir.map(|dir| &*dir.leak());
let hint = exercise_info.hint.leak().trim_ascii();
+ let canonical_path = dir_canonical_path.as_deref().map(|dir_canonical_path| {
+ let mut canonical_path;
+ if let Some(dir) = dir {
+ canonical_path = String::with_capacity(
+ 2 + dir_canonical_path.len() + dir.len() + name.len(),
+ );
+ canonical_path.push_str(dir_canonical_path);
+ canonical_path.push_str(MAIN_SEPARATOR_STR);
+ canonical_path.push_str(dir);
+ } else {
+ canonical_path =
+ String::with_capacity(1 + dir_canonical_path.len() + name.len());
+ canonical_path.push_str(dir_canonical_path);
+ }
+
+ canonical_path.push_str(MAIN_SEPARATOR_STR);
+ canonical_path.push_str(name);
+ canonical_path.push_str(".rs");
+ canonical_path
+ });
+
Exercise {
dir,
name,
path,
+ canonical_path,
test: exercise_info.test,
strict_clippy: exercise_info.strict_clippy,
hint,
@@ -486,6 +510,7 @@ mod tests {
dir: None,
name: "0",
path: "exercises/0.rs",
+ canonical_path: None,
test: false,
strict_clippy: false,
hint: "",