recon-cli 0.92.2

Versatile network reconnaissance CLI: HTTP/TLS/DNS, multi-protocol probes, and a Rhai script engine
Documentation
//! Slovak VAT.

use super::super::Verdict;
use anyhow::{anyhow, Result};

pub fn verify_sk_vat(input: &str) -> Verdict {
    let clean = match super::strip_vat_prefix(input, "SK") {
        Ok(body) => body,
        Err(v) => return v,
    };
    if clean.len() != 10 {
        return Verdict::Invalid { reason: format!("expected 10 digits, got {}", clean.len()) };
    }
    if !clean.chars().all(|c| c.is_ascii_digit()) {
        return Verdict::Invalid { reason: "non-digit input".into() };
    }
    if clean.starts_with('0') {
        return Verdict::Invalid { reason: "SK VAT first digit must not be 0".into() };
    }
    let n: u64 = clean.parse().expect("validated above");
    if n % 11 == 0 {
        Verdict::Valid { formatted: format!("SK{}", clean), detected: "Slovak VAT".into(), comment: String::new() }
    } else {
        Verdict::Invalid { reason: format!("SK VAT: {} mod 11 != 0", clean) }
    }
}

pub fn create_sk_vat(_input: &str, _raw: bool) -> Result<String> {
    Err(anyhow!("SK VAT has no trailing check digit — the full 10-digit number must be divisible by 11. Use --checkdigit sk-vat to verify."))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn sk_vat_valid_2022749619() {
        match verify_sk_vat("2022749619") {
            Verdict::Valid { .. } => {}
            v => panic!("{:?}", v),
        }
    }

    #[test]
    fn sk_vat_rejects_leading_zero() {
        match verify_sk_vat("0022749619") {
            Verdict::Invalid { reason } => assert!(reason.contains("must not be 0")),
            _ => panic!(),
        }
    }

    #[test]
    fn sk_vat_rejects_non_divisible() {
        match verify_sk_vat("2022749618") {
            Verdict::Invalid { .. } => {}
            _ => panic!(),
        }
    }
}