cfspeedtest 2.0.3

Unofficial CLI for speed.cloudflare.com
Documentation
use cfspeedtest::speedtest;
use cfspeedtest::OutputFormat;
use cfspeedtest::SpeedTestCLIOptions;
use clap::{CommandFactory, Parser};
use clap_complete::generate;
use std::io;
use std::net::IpAddr;

use speedtest::speed_test;

fn print_completions<G: clap_complete::Generator>(gen: G, cmd: &mut clap::Command) {
    generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout());
}

fn main() {
    env_logger::init();
    let options = SpeedTestCLIOptions::parse();

    if let Some(generator) = options.completion {
        let mut cmd = SpeedTestCLIOptions::command();
        eprintln!("Generating completion script for {generator}...");
        print_completions(generator, &mut cmd);
        return;
    }

    if options.output_format == OutputFormat::StdOut {
        println!("Starting Cloudflare speed test");
    }
    let client;
    if let Some(ref ip) = options.ipv4 {
        client = reqwest::blocking::Client::builder()
            .local_address(ip.parse::<IpAddr>().expect("Invalid IPv4 address"))
            .timeout(std::time::Duration::from_secs(30))
            .build();
    } else if let Some(ref ip) = options.ipv6 {
        client = reqwest::blocking::Client::builder()
            .local_address(ip.parse::<IpAddr>().expect("Invalid IPv6 address"))
            .timeout(std::time::Duration::from_secs(30))
            .build();
    } else {
        client = reqwest::blocking::Client::builder()
            .timeout(std::time::Duration::from_secs(30))
            .build();
    }
    speed_test(
        client.expect("Failed to initialize reqwest client"),
        options,
    );
}