Skip to content

Commit

Permalink
Add command line arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
profiluefter committed Sep 23, 2023
1 parent 8444727 commit 7096203
Show file tree
Hide file tree
Showing 3 changed files with 256 additions and 11 deletions.
214 changes: 214 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ edition = "2021"

[dependencies]
delay-queue = "0.2"
clap = { version = "4.4", features = ["derive"] }

[dev-dependencies]
test_bin = "0.4"
Expand Down
52 changes: 41 additions & 11 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
use std::fs::File;
use std::io::{Read, stdin, stdout, Write};
use std::thread;
use std::time::Duration;

use clap::Parser;
use delay_queue::{Delay, DelayQueue};

fn main() {
let args = Args::parse();

let mut queue: DelayQueue<Delay<Vec<u8>>> = DelayQueue::new();

let mut consumer_queue = queue.clone();
Expand All @@ -20,27 +25,52 @@ fn main() {
}
});

let mut reader = stdin();
let mut buffer = [0; 1024];

loop {
let read = reader.read(&mut buffer).unwrap();
queue.push(Delay::for_duration(
buffer[0..read].to_vec(),
Duration::from_secs(1),
));
if read == 0 {
break;
let mut readers: Vec<Box<dyn Read>> = args.input_files
.unwrap_or(vec!["-".to_string()])
.iter()
.map(|file| match file.as_str() {
"-" => Box::new(stdin()) as Box<dyn Read>,
_ => Box::new(File::open(file).expect("Failed to open file")),
})
.collect();

let mut buffer = vec![0u8; args.buffer_size as usize];

for reader in readers.iter_mut() {
loop {
let read = reader.read(&mut buffer).unwrap();
if read == 0 {
break;
}
queue.push(Delay::for_duration(
buffer[0..read].to_vec(),
Duration::from_millis(args.delay_ms),
));
}
}
queue.push(Delay::for_duration(
vec![],
Duration::from_millis(args.delay_ms)
));

consumer_handle.join().unwrap();
}

#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long, default_value_t = 1000)]
delay_ms: u64,
#[arg(short, long, default_value_t = 1024 * 1024)]
buffer_size: u64,
input_files: Option<Vec<String>>,
}

#[cfg(test)]
mod tests {
use std::io::Write;
use std::process::Stdio;

use rand::RngCore;

fn generate_test_data() -> Vec<u8> {
Expand Down

0 comments on commit 7096203

Please sign in to comment.