use std::path::PathBuf;
use std::time::Duration;
use anyhow::{Result, bail};
use clap::Args;
use crate::settings::{self, Environment};
const IDENTITY_ENV: &str = "AION_WORKER_IDENTITY";
const CONCURRENCY_ENV: &str = "AION_WORKER_CONCURRENCY";
const INITIAL_BACKOFF_ENV: &str = "AION_RECONNECT_INITIAL_BACKOFF_SECONDS";
const MAX_BACKOFF_ENV: &str = "AION_RECONNECT_MAX_BACKOFF_SECONDS";
const MAX_ATTEMPTS_ENV: &str = "AION_RECONNECT_MAX_ATTEMPTS";
#[derive(Debug, Args)]
pub(crate) struct AwlWorkerArgs {
pub(crate) document: PathBuf,
#[arg(long)]
pub(crate) identity: Option<String>,
#[arg(long)]
pub(crate) concurrency: Option<String>,
#[arg(long)]
pub(crate) reconnect_initial_backoff: Option<String>,
#[arg(long)]
pub(crate) reconnect_max_backoff: Option<String>,
#[arg(long)]
pub(crate) reconnect_max_attempts: Option<String>,
#[arg(long)]
pub(crate) check: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) struct ConnectionSettings {
pub(crate) identity: String,
pub(crate) concurrency: usize,
pub(crate) initial_backoff: Duration,
pub(crate) max_backoff: Duration,
pub(crate) max_attempts: usize,
}
pub(crate) fn resolve(
args: &AwlWorkerArgs,
task_queue: &str,
environment: &Environment,
) -> Result<ConnectionSettings> {
let mut missing = Vec::new();
let identity = settings::optional(args.identity.clone(), IDENTITY_ENV, environment)
.unwrap_or_else(|| format!("{task_queue}-awl-worker"));
let concurrency = settings::resolve_one(
args.concurrency.clone(),
CONCURRENCY_ENV,
"--concurrency",
environment,
&mut missing,
);
let initial_backoff = settings::resolve_one(
args.reconnect_initial_backoff.clone(),
INITIAL_BACKOFF_ENV,
"--reconnect-initial-backoff",
environment,
&mut missing,
);
let max_backoff = settings::resolve_one(
args.reconnect_max_backoff.clone(),
MAX_BACKOFF_ENV,
"--reconnect-max-backoff",
environment,
&mut missing,
);
let max_attempts = settings::resolve_one(
args.reconnect_max_attempts.clone(),
MAX_ATTEMPTS_ENV,
"--reconnect-max-attempts",
environment,
&mut missing,
);
settings::refuse_if_missing(missing)?;
let (Some(concurrency), Some(initial_backoff), Some(max_backoff), Some(max_attempts)) =
(concurrency, initial_backoff, max_backoff, max_attempts)
else {
bail!("every worker connection setting must be resolved before use");
};
Ok(ConnectionSettings {
identity,
concurrency: settings::positive_usize(&concurrency, "--concurrency", CONCURRENCY_ENV)?,
initial_backoff: settings::positive_seconds(
&initial_backoff,
"--reconnect-initial-backoff",
INITIAL_BACKOFF_ENV,
)?,
max_backoff: settings::positive_seconds(
&max_backoff,
"--reconnect-max-backoff",
MAX_BACKOFF_ENV,
)?,
max_attempts: settings::positive_usize(
&max_attempts,
"--reconnect-max-attempts",
MAX_ATTEMPTS_ENV,
)?,
})
}