use crate::visitors::SendVisitor;
use reqwest::Url;
use std::path::PathBuf;
use walker_common::sender::{
HttpSender, HttpSenderOptions, provider::OpenIdTokenProviderConfigArguments,
};
#[derive(Debug, clap::Parser)]
#[command(next_help_heading = "Sending")]
pub struct SendArguments {
pub target: Url,
#[arg(
id = "sender-connect-timeout",
long,
env = "SENDER_CONNECT_TIMEOUT",
default_value = "15s"
)]
pub connect_timeout: humantime::Duration,
#[arg(
id = "sender-timeout",
long,
env = "SENDER_TIMEOUT",
default_value = "5m"
)]
pub timeout: humantime::Duration,
#[arg(id = "sender-tls-ca-certificate", long)]
pub additional_root_certificates: Vec<PathBuf>,
#[arg(id = "sender-tls-insecure", long)]
pub tls_insecure: bool,
#[arg(
id = "sender-retries",
long,
env = "SENDER_RETRIES",
default_value = "0"
)]
pub retries: usize,
#[arg(
id = "sender-min-delay",
long,
env = "SENDER_MIN_DELAY",
default_value = "1s"
)]
pub min_delay: humantime::Duration,
#[arg(
id = "sender-max-delay",
long,
env = "SENDER_MAX_DELAY",
default_value = "60s"
)]
pub max_delay: humantime::Duration,
#[arg(
id = "sender-query-parameter",
long,
env = "SENDER_QUERY_PARAMETER",
value_delimiter = ','
)]
pub query: Vec<String>,
#[command(flatten)]
pub oidc: OpenIdTokenProviderConfigArguments,
}
impl SendArguments {
pub async fn into_visitor(self) -> Result<SendVisitor, anyhow::Error> {
let SendArguments {
target,
connect_timeout,
timeout,
additional_root_certificates,
tls_insecure,
retries,
min_delay,
max_delay,
oidc,
query,
} = self;
let provider = oidc.into_provider().await?;
let sender = HttpSender::new(
provider,
HttpSenderOptions::default()
.connect_timeout(Some(connect_timeout.into()))
.timeout(Some(timeout.into()))
.tls_insecure(tls_insecure)
.additional_root_certificates(additional_root_certificates)
.query_parameters(query.into_iter().map(|entry| match entry.split_once('=') {
Some((key, value)) => (key.to_string(), value.to_string()),
None => (entry, "".to_string()),
})),
)
.await?;
Ok(SendVisitor::new(target, sender)
.retries(retries)
.min_delay(min_delay)
.max_delay(max_delay))
}
}