From 4ae3fcc3caf91d4b22680ed4497c8ee05296eaad Mon Sep 17 00:00:00 2001
From: mo8it <mo8it@proton.me>
Date: Mon, 13 May 2024 17:06:11 +0200
Subject: [PATCH] Don't skip exercises on file changes

---
 src/app_state.rs   | 4 ++++
 src/watch.rs       | 2 +-
 src/watch/state.rs | 9 ++++++++-
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/app_state.rs b/src/app_state.rs
index 85639e5..75014ce 100644
--- a/src/app_state.rs
+++ b/src/app_state.rs
@@ -198,6 +198,10 @@ impl AppState {
     }
 
     pub fn set_current_exercise_ind(&mut self, exercise_ind: usize) -> Result<()> {
+        if exercise_ind == self.current_exercise_ind {
+            return Ok(());
+        }
+
         if exercise_ind >= self.exercises.len() {
             bail!(BAD_INDEX_ERR);
         }
diff --git a/src/watch.rs b/src/watch.rs
index f72ebf7..2fbc533 100644
--- a/src/watch.rs
+++ b/src/watch.rs
@@ -95,7 +95,7 @@ pub fn watch(
             WatchEvent::Input(InputEvent::Run) => watch_state.run_current_exercise()?,
             WatchEvent::Input(InputEvent::Unrecognized) => watch_state.render()?,
             WatchEvent::FileChange { exercise_ind } => {
-                watch_state.run_exercise_with_ind(exercise_ind)?;
+                watch_state.handle_file_change(exercise_ind)?;
             }
             WatchEvent::TerminalResize => {
                 watch_state.render()?;
diff --git a/src/watch/state.rs b/src/watch/state.rs
index 74cf182..60b6d5a 100644
--- a/src/watch/state.rs
+++ b/src/watch/state.rs
@@ -72,7 +72,14 @@ impl<'a> WatchState<'a> {
         self.render()
     }
 
-    pub fn run_exercise_with_ind(&mut self, exercise_ind: usize) -> Result<()> {
+    pub fn handle_file_change(&mut self, exercise_ind: usize) -> Result<()> {
+        // Don't skip exercises on file changes to avoid confusion from missing exercises.
+        // Skipping exercises must be explicit in the interactive list.
+        // But going back to an earlier exercise on file change is fine.
+        if self.app_state.current_exercise_ind() < exercise_ind {
+            return Ok(());
+        }
+
         self.app_state.set_current_exercise_ind(exercise_ind)?;
         self.run_current_exercise()
     }