rust-validador 1.0.0

Aula de como criar uma crate
Documentation
pub mod validadores {

    pub fn cpf(cpf: &str) -> bool {
        // Remove caracteres que não são números
        let cpf: String = cpf.chars().filter(|c| c.is_ascii_digit()).collect();

        // CPF deve ter 11 dígitos
        if cpf.len() != 11 {
            return false;
        }

        let numeros: Vec<u32> = cpf.chars().map(|c| c.to_digit(10).unwrap()).collect();

        // Rejeita CPFs com todos os dígitos iguais
        if numeros.iter().all(|&n| n == numeros[0]) {
            return false;
        }

        // Primeiro dígito verificador
        let soma1: u32 = numeros[..9]
            .iter()
            .enumerate()
            .map(|(i, &n)| n * (10 - i as u32))
            .sum();

        let resto1 = soma1 % 11;
        let dv1 = if resto1 < 2 { 0 } else { 11 - resto1 };

        if numeros[9] != dv1 {
            return false;
        }

        // Segundo dígito verificador
        let soma2: u32 = numeros[..10]
            .iter()
            .enumerate()
            .map(|(i, &n)| n * (11 - i as u32))
            .sum();

        let resto2 = soma2 % 11;
        let dv2 = if resto2 < 2 { 0 } else { 11 - resto2 };

        numeros[10] == dv2
    }

    pub fn cnpj(cnpj: &str) -> bool {
        // Remove caracteres que não são números
        let cnpj: String = cnpj.chars().filter(|c| c.is_ascii_digit()).collect();

        // CNPJ deve ter 14 dígitos
        if cnpj.len() != 14 {
            return false;
        }

        let numeros: Vec<u32> = cnpj
            .chars()
            .map(|c| c.to_digit(10).unwrap())
            .collect();

        // Rejeita CNPJs com todos os dígitos iguais
        if numeros.iter().all(|&n| n == numeros[0]) {
            return false;
        }

        // Primeiro dígito verificador
        let pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];

        let soma1: u32 = numeros[..12]
            .iter()
            .zip(pesos1.iter())
            .map(|(&n, &peso)| n * peso)
            .sum();

        let resto1 = soma1 % 11;
        let dv1 = if resto1 < 2 { 0 } else { 11 - resto1 };

        if numeros[12] != dv1 {
            return false;
        }

        // Segundo dígito verificador
        let pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];

        let soma2: u32 = numeros[..13]
            .iter()
            .zip(pesos2.iter())
            .map(|(&n, &peso)| n * peso)
            .sum();

        let resto2 = soma2 % 11;
        let dv2 = if resto2 < 2 { 0 } else { 11 - resto2 };

        numeros[13] == dv2
    }

}