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 clap::parser::ValueSource;

use crate::args::{ConnectToMapping, PositiveU64, PositiveUsize, parse_connect_to, parse_header};
use crate::error::{AppError, AppResult, ConfigError};

pub(super) fn is_cli(matches: &ArgMatches, name: &str) -> bool {
    matches.value_source(name) == Some(ValueSource::CommandLine)
}

pub(super) fn ensure_positive_u64(value: u64, field: &str) -> AppResult<PositiveU64> {
    PositiveU64::try_from(value).map_err(|err| {
        AppError::config(ConfigError::FieldMustBePositive {
            field: field.to_owned(),
            source: err,
        })
    })
}

pub(super) fn ensure_positive_usize(value: usize, field: &str) -> AppResult<PositiveUsize> {
    PositiveUsize::try_from(value).map_err(|err| {
        AppError::config(ConfigError::FieldMustBePositive {
            field: field.to_owned(),
            source: err,
        })
    })
}

pub(super) fn parse_headers(headers: &[String]) -> AppResult<Vec<(String, String)>> {
    let mut parsed = Vec::with_capacity(headers.len());
    for header in headers {
        parsed.push(
            parse_header(header)
                .map_err(|err| AppError::config(ConfigError::InvalidHeader { source: err }))?,
        );
    }
    Ok(parsed)
}

pub(super) fn parse_connect_to_entries(entries: &[String]) -> AppResult<Vec<ConnectToMapping>> {
    let mut parsed = Vec::with_capacity(entries.len());
    for entry in entries {
        parsed.push(
            parse_connect_to(entry)
                .map_err(|err| AppError::config(ConfigError::InvalidConnectTo { source: err }))?,
        );
    }
    Ok(parsed)
}