strest 0.1.10

Blazing-fast async HTTP load tester in Rust - lock-free design, real-time stats, distributed runs, and optional chart exports for high-load API testing.
Documentation
use clap::ArgMatches;

use crate::args::TesterArgs;
use crate::error::{AppError, AppResult, ConfigError};

use super::super::types::DistributedConfig;
use super::util::{ensure_positive_u64, ensure_positive_usize, is_cli};

pub(super) fn apply_distributed_config(
    args: &mut TesterArgs,
    matches: &ArgMatches,
    config: &DistributedConfig,
) -> AppResult<()> {
    if !is_cli(matches, "controller_mode")
        && let Some(mode) = config.controller_mode
    {
        args.controller_mode = mode;
    }

    let role = config
        .role
        .as_deref()
        .map(|value| value.trim().to_ascii_lowercase());

    let mut role_applied = false;
    match role.as_deref() {
        Some("controller") => {
            role_applied = true;
            if !is_cli(matches, "controller_listen")
                && let Some(listen) = config.listen.clone()
            {
                args.controller_listen = Some(listen);
            }
        }
        Some("agent") => {
            role_applied = true;
            if !is_cli(matches, "agent_join")
                && let Some(join) = config.join.clone()
            {
                args.agent_join = Some(join);
            }
        }
        Some(other) => {
            return Err(AppError::config(ConfigError::InvalidDistributedRole {
                value: other.to_owned(),
            }));
        }
        None => {}
    }

    if !role_applied {
        if !is_cli(matches, "controller_listen")
            && let Some(listen) = config.listen.clone()
        {
            args.controller_listen = Some(listen);
        }

        if !is_cli(matches, "agent_join")
            && let Some(join) = config.join.clone()
        {
            args.agent_join = Some(join);
        }
    }

    if !is_cli(matches, "control_listen")
        && let Some(listen) = config.control_listen.clone()
    {
        args.control_listen = Some(listen);
    }

    if !is_cli(matches, "control_auth_token")
        && let Some(token) = config.control_auth_token.clone()
    {
        args.control_auth_token = Some(token);
    }

    if !is_cli(matches, "auth_token")
        && let Some(token) = config.auth_token.clone()
    {
        args.auth_token = Some(token);
    }

    if !is_cli(matches, "agent_id")
        && let Some(agent_id) = config.agent_id.clone()
    {
        args.agent_id = Some(agent_id);
    }

    if !is_cli(matches, "agent_weight")
        && let Some(weight) = config.weight
    {
        args.agent_weight = ensure_positive_u64(weight, "distributed.weight")?;
    }

    if !is_cli(matches, "min_agents")
        && let Some(min_agents) = config.min_agents
    {
        args.min_agents = ensure_positive_usize(min_agents, "distributed.min_agents")?;
    }

    if !is_cli(matches, "agent_wait_timeout_ms")
        && let Some(timeout_ms) = config.agent_wait_timeout_ms
    {
        args.agent_wait_timeout_ms = Some(ensure_positive_u64(
            timeout_ms,
            "distributed.agent_wait_timeout_ms",
        )?);
    }

    if !is_cli(matches, "agent_standby")
        && let Some(standby) = config.agent_standby
    {
        args.agent_standby = standby;
    }

    if !is_cli(matches, "agent_reconnect_ms")
        && let Some(interval_ms) = config.agent_reconnect_ms
    {
        args.agent_reconnect_ms =
            ensure_positive_u64(interval_ms, "distributed.agent_reconnect_ms")?;
    }

    if !is_cli(matches, "agent_heartbeat_interval_ms")
        && let Some(interval_ms) = config.agent_heartbeat_interval_ms
    {
        args.agent_heartbeat_interval_ms =
            ensure_positive_u64(interval_ms, "distributed.agent_heartbeat_interval_ms")?;
    }

    if !is_cli(matches, "agent_heartbeat_timeout_ms")
        && let Some(timeout_ms) = config.agent_heartbeat_timeout_ms
    {
        args.agent_heartbeat_timeout_ms =
            ensure_positive_u64(timeout_ms, "distributed.agent_heartbeat_timeout_ms")?;
    }

    if !is_cli(matches, "distributed_stream_summaries")
        && let Some(stream_summaries) = config.stream_summaries
    {
        args.distributed_stream_summaries = stream_summaries;
    }

    if !is_cli(matches, "distributed_stream_interval_ms")
        && let Some(interval_ms) = config.stream_interval_ms
    {
        args.distributed_stream_interval_ms = Some(ensure_positive_u64(
            interval_ms,
            "distributed.stream_interval_ms",
        )?);
    }

    Ok(())
}