From 1dde9216b9fc231720815963a5417066f3160248 Mon Sep 17 00:00:00 2001 From: jakka Date: Thu, 19 Jun 2025 20:51:02 +0300 Subject: added graceful shutdown --- src/main.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 5273921..1dd6f1b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use anyhow::Result; use clap::{Arg, ArgAction, Command, ValueHint, command, value_parser}; use clap_complete::{Generator, Shell, generate}; use std::path::PathBuf; +use tokio_util::sync::CancellationToken; fn build_cli() -> Command { command!() @@ -86,23 +87,44 @@ fn main() -> Result<()> { } else { db::open_default_db().await? }; + + let root_canceltoken = CancellationToken::new(); + + let canceltoken = root_canceltoken.clone(); + + tokio::spawn(async move { + let _ = tokio::signal::ctrl_c().await; + root_canceltoken.cancel(); + }); + let path = args.get_one::("path"); if path.is_none() && !args.get_flag("clean") && !args.get_flag("doit") { let count = conn.get_toencode_number().await?; println!("Files to reencode:\t{count}"); + return Ok(()); } if let Some(realpath) = path { - files::index_files_recursively(realpath, &conn).await?; + let newtoken = canceltoken.clone(); + files::index_files_recursively(realpath, &conn, newtoken).await?; + } + + if canceltoken.is_cancelled() { + return Ok(()); } if args.get_flag("clean") { conn.clean_files().await?; } + if canceltoken.is_cancelled() { + return Ok(()); + } + if args.get_flag("doit") { - files::reencode_files(&conn).await?; + let newtoken = canceltoken.clone(); + files::reencode_files(&conn, newtoken).await?; } Ok::<(), anyhow::Error>(()) })?; -- cgit v1.3.1