@@ -6,9 +6,12 @@ use notify::DebouncedEvent;
66use notify:: { RecommendedWatcher , RecursiveMode , Watcher } ;
77use std:: ffi:: OsStr ;
88use std:: fs;
9+ use std:: io;
910use std:: path:: Path ;
1011use std:: process:: { Command , Stdio } ;
1112use std:: sync:: mpsc:: channel;
13+ use std:: sync:: { Arc , Mutex } ;
14+ use std:: thread;
1215use std:: time:: Duration ;
1316
1417mod exercise;
@@ -108,6 +111,26 @@ fn main() {
108111 }
109112}
110113
114+ fn spawn_watch_shell ( failed_exercise_hint : & Arc < Mutex < Option < String > > > ) {
115+ let failed_exercise_hint = Arc :: clone ( failed_exercise_hint) ;
116+ println ! ( "Type 'hint' to get help" ) ;
117+ thread:: spawn ( move || loop {
118+ let mut input = String :: new ( ) ;
119+ match io:: stdin ( ) . read_line ( & mut input) {
120+ Ok ( _) => {
121+ if input. trim ( ) . eq ( "hint" ) {
122+ if let Some ( hint) = & * failed_exercise_hint. lock ( ) . unwrap ( ) {
123+ println ! ( "{}" , hint) ;
124+ }
125+ } else {
126+ println ! ( "unknown command: {}" , input) ;
127+ }
128+ }
129+ Err ( error) => println ! ( "error reading command: {}" , error) ,
130+ }
131+ } ) ;
132+ }
133+
111134fn watch ( exercises : & [ Exercise ] ) -> notify:: Result < ( ) > {
112135 /* Clears the terminal with an ANSI escape code.
113136 Works in UNIX and newer Windows terminals. */
@@ -121,8 +144,11 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> {
121144 watcher. watch ( Path :: new ( "./exercises" ) , RecursiveMode :: Recursive ) ?;
122145
123146 clear_screen ( ) ;
124- let _ignored = verify ( exercises. iter ( ) ) ;
147+ let verify_result = verify ( exercises. iter ( ) ) ;
125148
149+ let to_owned_hint = |t : & Exercise | t. hint . to_owned ( ) ;
150+ let failed_exercise_hint = Arc :: new ( Mutex :: new ( verify_result. map_err ( to_owned_hint) . err ( ) ) ) ;
151+ spawn_watch_shell ( & failed_exercise_hint) ;
126152 loop {
127153 match rx. recv ( ) {
128154 Ok ( event) => match event {
@@ -133,7 +159,9 @@ fn watch(exercises: &[Exercise]) -> notify::Result<()> {
133159 . iter ( )
134160 . skip_while ( |e| !filepath. ends_with ( & e. path ) ) ;
135161 clear_screen ( ) ;
136- let _ignored = verify ( pending_exercises) ;
162+ let verify_result = verify ( pending_exercises) ;
163+ let mut failed_exercise_hint = failed_exercise_hint. lock ( ) . unwrap ( ) ;
164+ * failed_exercise_hint = verify_result. map_err ( to_owned_hint) . err ( ) ;
137165 }
138166 }
139167 _ => { }
0 commit comments