use std::time::Duration;
use clap::Args as ClapArgs;
use reqwest::Client;
use url::Url;
#[derive(Debug, Clone, ClapArgs)]
pub struct ReplayArgs {
#[arg(long)]
pub since: Option<String>,
#[arg(long)]
pub doc: Option<String>,
#[arg(long, default_value_t = 100)]
pub limit: usize,
}
pub async fn run(args: ReplayArgs, server: &Url) -> i32 {
let client = match Client::builder().timeout(Duration::from_secs(5)).build() {
Ok(c) => c,
Err(e) => {
eprintln!("client init: {e}");
return 1;
}
};
let mut url = match server.join("/api/events") {
Ok(u) => u,
Err(e) => {
eprintln!("invalid server URL: {e}");
return 2;
}
};
{
let mut qp = url.query_pairs_mut();
if let Some(s) = &args.since {
qp.append_pair("since", s);
}
if let Some(d) = &args.doc {
qp.append_pair("doc", d);
}
qp.append_pair("limit", &args.limit.to_string());
}
match client.get(url).send().await {
Ok(resp) if resp.status().is_success() => match resp.text().await {
Ok(body) => {
print!("{body}");
0
}
Err(e) => {
eprintln!("read body: {e}");
1
}
},
Ok(resp) => {
eprintln!("server returned {}", resp.status());
2
}
Err(e) => {
eprintln!("request failed: {e}");
1
}
}
}
#[cfg(test)]
mod tests {
use url::Url;
#[test]
fn builds_url_with_query_params() {
let server: Url = Url::parse("http://127.0.0.1:4173").unwrap();
let mut url = server.join("/api/events").expect("join");
{
let mut qp = url.query_pairs_mut();
qp.append_pair("limit", "10");
}
assert_eq!(url.path(), "/api/events");
assert_eq!(url.query(), Some("limit=10"));
}
}