sql-cli 1.47.0

SQL query tool for CSV/JSON with both interactive TUI and non-interactive CLI modes - perfect for exploration and automation
Documentation
use std::env;
use std::fs::File;
use std::io::Write;
use std::path::Path;

/// Simple primality test for small numbers
fn is_prime(n: u32) -> bool {
    if n < 2 {
        return false;
    }
    if n == 2 {
        return true;
    }
    if n % 2 == 0 {
        return false;
    }

    let sqrt_n = f64::from(n).sqrt() as u32;
    for i in (3..=sqrt_n).step_by(2) {
        if n % i == 0 {
            return false;
        }
    }
    true
}

/// Generate the first N prime numbers
fn generate_primes(count: usize) -> Vec<u32> {
    let mut primes = Vec::with_capacity(count);
    let mut candidate = 2u32;

    while primes.len() < count {
        if is_prime(candidate) {
            primes.push(candidate);
        }
        candidate += if candidate == 2 { 1 } else { 2 };
    }

    primes
}

fn main() {
    println!("cargo:rerun-if-changed=build.rs");

    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("primes_data.rs");

    // Generate different prime tables
    let primes_1k = generate_primes(1_000);
    let primes_10k = generate_primes(10_000);
    let primes_100k = generate_primes(100_000);

    let mut f = File::create(&dest_path).unwrap();

    // Write file header
    writeln!(f, "// Auto-generated prime number tables").unwrap();
    writeln!(f, "// Generated by build.rs at compile time").unwrap();
    writeln!(f).unwrap();

    // Write the first 1,000 primes (for quick access)
    writeln!(f, "/// First 1,000 prime numbers (up to 7,919)").unwrap();
    writeln!(f, "pub const PRIMES_1K: &[u32; {}] = &[", primes_1k.len()).unwrap();
    for (i, &p) in primes_1k.iter().enumerate() {
        if i % 10 == 0 {
            write!(f, "\n    ").unwrap();
        }
        write!(f, "{p:6}, ").unwrap();
    }
    writeln!(f, "\n];").unwrap();
    writeln!(f).unwrap();

    // Write the first 10,000 primes (for medium queries)
    writeln!(f, "/// First 10,000 prime numbers (up to 104,729)").unwrap();
    writeln!(f, "pub const PRIMES_10K: &[u32; {}] = &[", primes_10k.len()).unwrap();
    for (i, &p) in primes_10k.iter().enumerate() {
        if i % 10 == 0 {
            write!(f, "\n    ").unwrap();
        }
        write!(f, "{p:6}, ").unwrap();
    }
    writeln!(f, "\n];").unwrap();
    writeln!(f).unwrap();

    // For 100K primes, we'll use a more compact representation
    // Just store as a static array without pretty printing
    writeln!(f, "/// First 100,000 prime numbers (up to 1,299,709)").unwrap();
    writeln!(
        f,
        "pub const PRIMES_100K: &[u32; {}] = &[",
        primes_100k.len()
    )
    .unwrap();
    for (i, &p) in primes_100k.iter().enumerate() {
        if i % 10 == 0 {
            write!(f, "\n    ").unwrap();
        }
        write!(f, "{p}, ").unwrap();
    }
    writeln!(f, "\n];").unwrap();

    println!(
        "Generated {} primes (largest: {})",
        primes_100k.len(),
        primes_100k.last().unwrap()
    );
    println!("  1K primes: up to {}", primes_1k.last().unwrap());
    println!(" 10K primes: up to {}", primes_10k.last().unwrap());
    println!("100K primes: up to {}", primes_100k.last().unwrap());
}