pub mod boxplot;
pub mod measurements;
pub mod progress;
pub mod speedtest;
use std::fmt;
use std::fmt::Display;
use clap::Parser;
use speedtest::PayloadSize;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum OutputFormat {
Csv,
Json,
JsonPretty,
StdOut,
None,
}
impl Display for OutputFormat {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
impl OutputFormat {
pub fn from(output_format_string: String) -> Result<Self, String> {
match output_format_string.to_lowercase().as_str() {
"csv" => Ok(Self::Csv),
"json" => Ok(Self::Json),
"json_pretty" | "json-pretty" => Ok(Self::JsonPretty),
"stdout" => Ok(Self::StdOut),
_ => Err("Value needs to be one of csv, json or json-pretty".to_string()),
}
}
}
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct SpeedTestCLIOptions {
#[arg(value_parser = clap::value_parser!(u32).range(4..1000), short, long, default_value_t = 10)]
pub nr_tests: u32,
#[arg(long, default_value_t = 25)]
pub nr_latency_tests: u32,
#[arg(value_parser = parse_payload_size, short, long, default_value_t = PayloadSize::M25)]
pub max_payload_size: PayloadSize,
#[arg(value_parser = parse_output_format, short, long, default_value_t = OutputFormat::StdOut)]
pub output_format: OutputFormat,
#[arg(short, long)]
pub verbose: bool,
#[arg(long)]
pub ipv4: bool,
#[arg(long)]
pub ipv6: bool,
#[arg(short, long)]
pub disable_dynamic_max_payload_size: bool,
}
fn parse_payload_size(input_string: &str) -> Result<PayloadSize, String> {
PayloadSize::from(input_string.to_string())
}
fn parse_output_format(input_string: &str) -> Result<OutputFormat, String> {
OutputFormat::from(input_string.to_string())
}