diff options
| author | jakka <jakkadoujin@gmail.com> | 2025-06-19 20:51:02 +0300 |
|---|---|---|
| committer | jakka <jakkadoujin@gmail.com> | 2025-06-19 20:51:02 +0300 |
| commit | 1dde9216b9fc231720815963a5417066f3160248 (patch) | |
| tree | 6e46dd41e01e3d4744ab12ff665b8757c94b250f /src/main.rs | |
| parent | d738c57dcf4fdea3c81d6ae63f04d699448e8ad1 (diff) | |
added graceful shutdown
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 26 |
1 files changed, 24 insertions, 2 deletions
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::<PathBuf>("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>(()) })?; |
