From 64fb7c9739d161da7543b923266598e6d5971a84 Mon Sep 17 00:00:00 2001 From: jRimbault Date: Fri, 19 Jan 2024 13:51:27 +0100 Subject: [PATCH] qr code maker --- qr/src/main.rs | 67 +++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/qr/src/main.rs b/qr/src/main.rs index c80a3e4..3541a83 100644 --- a/qr/src/main.rs +++ b/qr/src/main.rs @@ -1,4 +1,4 @@ -use std::{fs::File, path::PathBuf, sync::mpsc::sync_channel}; +use std::{fs::File, path::PathBuf, sync::mpsc::sync_channel, thread::Scope}; mod encoder; @@ -27,40 +27,41 @@ fn main() -> Result<()> { env_logger::builder() .filter_level(args.verbose.log_level_filter()) .init(); - run(&args) + std::thread::scope(|scope| run(scope, &args)) } -fn run(args: &Args) -> Result<()> { - std::thread::scope(|scope| { - let (sender, receiver) = sync_channel(args.files.len()); - for file in &args.files { - let name = file - .file_name() - .and_then(|n| n.to_str()) - .context("file name should be utf8")?; - let file = File::open(&file)?; - let sender = sender.clone(); - scope.spawn(move || { - let encoder = QrFileEncoder::new(file, name); - for (i, image) in encoder.into_iter().enumerate() { - log::debug!("encoded part of {name}"); - sender - .send((format!("{:02}-{name}.png", i + 1), image)) - .unwrap(); - } - }); - } - drop(sender); - let out = &args.out; - std::fs::create_dir_all(out)?; - for (name, image) in receiver { - let path = out.join(&name); - image.save(&path).context(format!("writing {name:?}"))?; - log::info!("saved {name:?} to {out:?}"); - if args.open { - open::that_detached(path)?; +fn run<'a, 'b>(scope: &'a Scope<'a, 'b>, args: &'b Args) -> Result<()> +where + 'b: 'a, +{ + let (sender, receiver) = sync_channel(args.files.len()); + for file in &args.files { + let name = file + .file_name() + .and_then(|n| n.to_str()) + .context("file name should be utf8")?; + let file = File::open(&file)?; + let sender = sender.clone(); + scope.spawn(move || { + let encoder = QrFileEncoder::new(file, name); + for (i, image) in encoder.into_iter().enumerate() { + log::debug!("encoded part of {name}"); + sender + .send((format!("{:02}-{name}.png", i + 1), image)) + .unwrap(); } + }); + } + drop(sender); + let out = &args.out; + std::fs::create_dir_all(out)?; + for (name, image) in receiver { + let path = out.join(&name); + image.save(&path).context(format!("writing {name:?}"))?; + log::info!("saved {name:?} to {out:?}"); + if args.open { + open::that_detached(path)?; } - Ok(()) - }) + } + Ok(()) }