diff --git a/README.md b/README.md index 77a0fc7..09f9046 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ pulsarss --source https://path/to/feed.rss * `source`, `s` - RSS feed source (required) * `target`, `t` - Destination directory (`public` by default) * `update`, `u` - Update timeout in seconds (`60` by default) +* `index`, `i` - Generate `index.gmi` file (`true` by default) +* `limit`, `l` - Limit channel items (unlimited by default) * `output`, `o` - Print output (`dw` by default): * `d` - debug * `w` - warning diff --git a/src/argument.rs b/src/argument.rs index a123e41..a56b828 100644 --- a/src/argument.rs +++ b/src/argument.rs @@ -3,6 +3,18 @@ use clap::Parser; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] pub struct Argument { + /// Generate `index.gmi` file (`true` by default) + #[arg(short, long, default_value_t = true)] + pub index: bool, + + /// Limit channel items (unlimited by default) + #[arg(short, long, default_value_t = 0)] + pub limit: usize, + + /// Show output (`dw` by default) + #[arg(short, long, default_value_t = String::from("dw"))] + pub output: String, + /// RSS feed source (required) #[arg(short, long)] pub source: String, @@ -14,8 +26,4 @@ pub struct Argument { /// Update timeout in seconds (`60` by default) #[arg(short, long, default_value_t = 60)] pub update: u64, - - /// Show output (`dw` by default) - #[arg(short, long, default_value_t = String::from("dw"))] - pub output: String, } diff --git a/src/main.rs b/src/main.rs index 512297f..e9f109a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,11 @@ mod argument; mod destination; mod output; +use argument::Argument; use output::Output; use std::error::Error; fn main() -> Result<(), Box> { - use argument::Argument; use clap::Parser; use std::{thread::sleep, time::Duration}; @@ -16,12 +16,12 @@ fn main() -> Result<(), Box> { output.debug("crawler started"); loop { - crawl(&argument.source, &argument.target, &output)?; + crawl(&argument, &output)?; sleep(Duration::from_secs(argument.update)); } } -fn crawl(source: &str, target: &str, output: &Output) -> Result<(), Box> { +fn crawl(argument: &Argument, output: &Output) -> Result<(), Box> { use destination::Destination; use reqwest::blocking::get; use rss::Channel; @@ -39,17 +39,21 @@ fn crawl(source: &str, target: &str, output: &Output) -> Result<(), Box 0 && total >= argument.limit { + break; + } + total += 1; let mut data = Vec::new(); let destination = match item.pub_date() { Some(pub_date) => { - let destination = Destination::build(target, pub_date, true)?; + let destination = Destination::build(&argument.target, pub_date, true)?; if metadata(destination.item()).is_ok() { exist += 1; continue; @@ -90,7 +94,9 @@ fn crawl(source: &str, target: &str, output: &Output) -> Result<(), Box