@@ -13,11 +13,12 @@ extern crate chrono;
13
13
extern crate serde;
14
14
extern crate serde_json;
15
15
16
- use std:: error:: Error ;
17
- use std:: path:: PathBuf ;
18
-
19
16
use chrono:: { DateTime , Utc } ;
20
17
use clap:: { Parser , Subcommand } ;
18
+ use std:: error:: Error ;
19
+ use std:: path:: PathBuf ;
20
+ use std:: sync:: mpsc:: { channel, RecvTimeoutError } ;
21
+ use std:: time:: Duration ;
21
22
22
23
use aw_client_rust:: blocking:: AwClient ;
23
24
@@ -207,6 +208,12 @@ fn main() -> Result<(), Box<dyn Error>> {
207
208
}
208
209
209
210
fn daemon ( client : & AwClient ) -> Result < ( ) , Box < dyn Error > > {
211
+ let ( tx, rx) = channel ( ) ;
212
+
213
+ ctrlc:: set_handler ( move || {
214
+ let _ = tx. send ( ( ) ) ;
215
+ } ) ?;
216
+
210
217
loop {
211
218
if let Err ( e) = daemon_sync_cycle ( client) {
212
219
error ! ( "Error during sync cycle: {}" , e) ;
@@ -215,8 +222,20 @@ fn daemon(client: &AwClient) -> Result<(), Box<dyn Error>> {
215
222
}
216
223
217
224
info ! ( "Sync pass done, sleeping for 5 minutes" ) ;
218
- std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 300 ) ) ;
225
+
226
+ // Wait for either the sleep duration or a termination signal
227
+ match rx. recv_timeout ( Duration :: from_secs ( 300 ) ) {
228
+ Ok ( _) | Err ( RecvTimeoutError :: Disconnected ) => {
229
+ info ! ( "Termination signal received, shutting down." ) ;
230
+ break ;
231
+ }
232
+ Err ( RecvTimeoutError :: Timeout ) => {
233
+ // Continue the loop if the timeout occurs
234
+ }
235
+ }
219
236
}
237
+
238
+ Ok ( ( ) )
220
239
}
221
240
222
241
fn daemon_sync_cycle ( client : & AwClient ) -> Result < ( ) , Box < dyn Error > > {
0 commit comments