Uma biblioteca Rust que fornece funções utilitárias para validação, formatação e geração de dados específicos do Brasil.
Esta biblioteca fornece utilitários abrangentes para manipular documentos, identificadores e formatos de dados brasileiros:
- CPF (Cadastro de Pessoas Físicas) - Registro de Contribuinte Individual
- CNPJ (Cadastro Nacional da Pessoa Jurídica) - Registro Nacional de Pessoas Jurídicas
- CNH (Carteira Nacional de Habilitação) - Carteira de Motorista Nacional
- PIS (Programa de Integração Social) - Programa de Integração Social
- Título de Eleitor - Registro Eleitoral
- Placas de Veículo - Validação e conversão de formatos antigo e Mercosul
- RENAVAM (Registro Nacional de Veículos Automotores) - Registro Nacional de Veículos
- Processo Judicial - Números de processo do sistema jurídico brasileiro
- Natureza Jurídica - Classificação de entidades jurídicas (60+ códigos oficiais)
- CEP (Código de Endereçamento Postal) - Código Postal com busca de endereço
- Telefone - Validação de celular e fixo com formatação
- Boleto - Validação de linha digitável de boleto bancário
- Moeda - Formatação de Real (BRL) e conversão para texto
- Utilitários de Data - Verificação de feriados e conversão de data para texto
- Email - Validação compatível com RFC 5322
Adicione ao seu Cargo.toml:
[dependencies]
brazilian_utils = "0.1.0"use brazilian_utils::cpf;
// Validar
assert!(cpf::is_valid("11144477735"));
// Formatar
let formatado = cpf::format_cpf("11144477735");
assert_eq!(formatado, Some("111.444.777-35".to_string()));
// Gerar CPF válido aleatório
let numero_cpf = cpf::generate();
assert!(cpf::is_valid(&numero_cpf));use brazilian_utils::cnpj;
// Validar
assert!(cnpj::is_valid("11222333000181"));
// Formatar
let formatado = cnpj::format_cnpj("11222333000181");
assert_eq!(formatado, Some("11.222.333/0001-81".to_string()));
// Gerar CNPJ válido aleatório
let numero_cnpj = cnpj::generate(None);
assert!(cnpj::is_valid(&numero_cnpj));use brazilian_utils::cep;
// Validar
assert!(cep::is_valid("01310200"));
// Formatar
let formatado = cep::format_cep("01310200");
assert_eq!(formatado, Some("01310-200".to_string()));
// Buscar endereço pelo CEP (requer internet)
if let Some(endereco) = cep::get_address_from_cep("01310200") {
println!("Rua: {}", endereco.street);
println!("Cidade: {}", endereco.city);
}use brazilian_utils::boleto;
// Validar linha digitável de boleto
assert!(boleto::is_valid("00190000090114971860168524522114675860000102656"));
// Validar com formatação (espaços e pontos)
assert!(boleto::is_valid("0019000009 01149.718601 68524.522114 6 75860000102656"));
// Validar linha inválida
assert!(!boleto::is_valid("00190000020114971860168524522114675860000102656"));use brazilian_utils::license_plate;
// Validar formato antigo
assert!(license_plate::is_valid("ABC1234", Some("old")));
// Validar formato Mercosul
assert!(license_plate::is_valid("ABC1D23", Some("mercosul")));
// Converter antiga para Mercosul
let mercosul = license_plate::convert_to_mercosul("ABC1234");
assert_eq!(mercosul, Some("ABC1C34".to_string()));
// Formatar
let formatado = license_plate::format_license_plate("ABC1234");
assert_eq!(formatado, Some("ABC-1234".to_string()));use brazilian_utils::currency;
// Formatar como moeda
let formatado = currency::format_currency(1234.56);
assert_eq!(formatado, "R$ 1.234,56");
// Converter para texto
let texto = currency::convert_real_to_text(1234.56);
assert_eq!(texto, "mil duzentos e trinta e quatro reais e cinquenta e seis centavos");use brazilian_utils::phone;
// Validar celular
assert!(phone::is_valid("11987654321", Some("mobile")));
// Validar fixo
assert!(phone::is_valid("1133334444", Some("landline")));
// Formatar
let formatado = phone::format_phone("11987654321");
assert_eq!(formatado, Some("(11) 98765-4321".to_string()));
// Gerar aleatório
let numero_telefone = phone::generate(Some("mobile"));
assert!(phone::is_valid(&numero_telefone, Some("mobile")));use brazilian_utils::voter_id;
// Validar
assert!(voter_id::is_valid("690847092828"));
// Formatar
let formatado = voter_id::format_voter_id("690847092828");
assert_eq!(formatado, Some("6908 4709 28 28".to_string()));
// Gerar para um estado específico
let titulo_sp = voter_id::generate(Some("SP")).unwrap();
assert!(voter_id::is_valid(&titulo_sp));use brazilian_utils::legal_process;
// Validar
assert!(legal_process::is_valid("00000000020248140141"));
// Formatar
let formatado = legal_process::format_legal_process("00000000020248140141");
assert_eq!(formatado, Some("0000000-00.2024.8.14.0141".to_string()));
// Gerar aleatório
let processo = legal_process::generate(Some(("8", "14", "0141")));
assert!(legal_process::is_valid(&processo.unwrap()));use brazilian_utils::date_utils;
use chrono::NaiveDate;
// Verificar se é feriado
let natal = NaiveDate::from_ymd_opt(2024, 12, 25).unwrap();
assert!(date_utils::is_holiday(&natal, None));
// Converter data para texto
let data = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();
let texto = date_utils::convert_date_to_text(&data);
assert_eq!(texto, Some("15 de janeiro de 2024".to_string()));| Módulo | Funções | Descrição |
|---|---|---|
boleto |
is_valid, validate |
Validação de linha digitável de boleto |
cep |
is_valid, format_cep, remove_symbols, generate, get_address_from_cep, get_cep_information_from_address |
Validação de CEP e busca de endereço |
cnh |
is_valid_cnh |
Validação de CNH |
cnpj |
is_valid, validate, format_cnpj, remove_symbols, generate, hashdigit, compute_checksum |
Validação de registro empresarial |
cpf |
is_valid, validate, format_cpf, remove_symbols, generate, hashdigit, compute_checksum |
Validação de CPF |
currency |
format_currency, convert_real_to_text, number_to_words |
Formatação e conversão de moeda |
date_utils |
is_holiday, convert_date_to_text |
Utilitários de data e verificação de feriados |
email |
is_valid |
Validação de email RFC 5322 |
legal_nature |
is_valid, get_description, list_all |
Códigos de natureza jurídica (60+ códigos) |
legal_process |
is_valid, format_legal_process, remove_symbols, generate |
Validação de número de processo |
license_plate |
is_valid, format_license_plate, remove_symbols, convert_to_mercosul, get_format, generate |
Placa de veículo (antiga/Mercosul) |
phone |
is_valid, format_phone, remove_symbols, generate, remove_international_dialing_code |
Validação de telefone |
pis |
is_valid, format_pis, remove_symbols, generate, checksum |
Número de integração social |
renavam |
is_valid, generate, calculate_checksum |
Número de registro de veículo |
voter_id |
is_valid, format_voter_id, generate, calculate_vd1, calculate_vd2 |
Validação de título de eleitor |
# Executar todos os testes
cargo test
# Executar testes de um módulo específico
cargo test cpf
# Executar com saída detalhada
cargo test -- --nocaptureA biblioteca inclui exemplos de demonstração abrangentes para cada módulo:
# Demonstração de CPF
cargo run --example cpf_demo
# Demonstração de CNPJ
cargo run --example cnpj_demo
# Demonstração de Placa de Veículo
cargo run --example license_plate_demo
# Demonstração de Título de Eleitor
cargo run --example voter_id_demo
# E muitos mais...- 149 testes unitários cobrindo toda a lógica de validação
- 55 testes de documentação garantindo que os exemplos funcionem corretamente
- Total: 204 testes com 100% de aprovação
rand- Geração de números aleatóriosreqwest- Cliente HTTP para busca de endereço por CEPserde/serde_json- Serialização JSONchrono- Manipulação de data e horaregex- Correspondência de expressões regularesunicode-normalization- Normalização de strings
Contribuições são bem-vindas! Sinta-se à vontade para enviar um Pull Request.
Este projeto está licenciado sob a Licença MIT.
Inspirado em brazilian-utils/python - Uma biblioteca Python com utilitários similares para dados brasileiros.
A Rust library providing utility functions for Brazilian-specific data validation, formatting, and generation.
This library provides comprehensive utilities for handling Brazilian documents, identifiers, and data formats:
- CPF (Cadastro de Pessoas Físicas) - Individual Taxpayer Registry
- CNPJ (Cadastro Nacional da Pessoa Jurídica) - National Registry of Legal Entities
- CNH (Carteira Nacional de Habilitação) - National Driver's License
- PIS (Programa de Integração Social) - Social Integration Program
- Voter ID (Título de Eleitor) - Electoral Registration
- License Plate - Old and Mercosul format validation and conversion
- RENAVAM (Registro Nacional de Veículos Automotores) - National Motor Vehicle Registry
- Legal Process - Brazilian legal system process numbers
- Legal Nature - Legal entity classification (60+ official codes)
- CEP (Código de Endereçamento Postal) - Postal Code with address lookup
- Phone - Mobile and landline validation with formatting
- Boleto - Bank slip digitable line validation
- Currency - Real (BRL) formatting and text conversion
- Date Utils - Holiday checking and date text conversion
- Email - RFC 5322 compliant validation
Add this to your Cargo.toml:
[dependencies]
brazilian_utils = "0.1.0"use brazilian_utils::cpf;
// Validate
assert!(cpf::is_valid("11144477735"));
// Format
let formatted = cpf::format_cpf("11144477735");
assert_eq!(formatted, Some("111.444.777-35".to_string()));
// Generate random valid CPF
let cpf_number = cpf::generate();
assert!(cpf::is_valid(&cpf_number));use brazilian_utils::cnpj;
// Validate
assert!(cnpj::is_valid("11222333000181"));
// Format
let formatted = cnpj::format_cnpj("11222333000181");
assert_eq!(formatted, Some("11.222.333/0001-81".to_string()));
// Generate random valid CNPJ
let cnpj_number = cnpj::generate(None);
assert!(cnpj::is_valid(&cnpj_number));use brazilian_utils::cep;
// Validate
assert!(cep::is_valid("01310200"));
// Format
let formatted = cep::format_cep("01310200");
assert_eq!(formatted, Some("01310-200".to_string()));
// Get address from CEP (requires internet)
if let Some(address) = cep::get_address_from_cep("01310200") {
println!("Street: {}", address.street);
println!("City: {}", address.city);
}use brazilian_utils::boleto;
// Validate boleto digitable line
assert!(boleto::is_valid("00190000090114971860168524522114675860000102656"));
// Validate with formatting (spaces and dots)
assert!(boleto::is_valid("0019000009 01149.718601 68524.522114 6 75860000102656"));
// Validate invalid line
assert!(!boleto::is_valid("00190000020114971860168524522114675860000102656"));use brazilian_utils::license_plate;
// Validate old format
assert!(license_plate::is_valid("ABC1234", Some("old")));
// Validate Mercosul format
assert!(license_plate::is_valid("ABC1D23", Some("mercosul")));
// Convert old to Mercosul
let mercosul = license_plate::convert_to_mercosul("ABC1234");
assert_eq!(mercosul, Some("ABC1C34".to_string()));
// Format
let formatted = license_plate::format_license_plate("ABC1234");
assert_eq!(formatted, Some("ABC-1234".to_string()));use brazilian_utils::currency;
// Format as currency
let formatted = currency::format_currency(1234.56);
assert_eq!(formatted, "R$ 1.234,56");
// Convert to text
let text = currency::convert_real_to_text(1234.56);
assert_eq!(text, "mil duzentos e trinta e quatro reais e cinquenta e seis centavos");use brazilian_utils::phone;
// Validate mobile
assert!(phone::is_valid("11987654321", Some("mobile")));
// Validate landline
assert!(phone::is_valid("1133334444", Some("landline")));
// Format
let formatted = phone::format_phone("11987654321");
assert_eq!(formatted, Some("(11) 98765-4321".to_string()));
// Generate random
let phone_number = phone::generate(Some("mobile"));
assert!(phone::is_valid(&phone_number, Some("mobile")));use brazilian_utils::voter_id;
// Validate
assert!(voter_id::is_valid("690847092828"));
// Format
let formatted = voter_id::format_voter_id("690847092828");
assert_eq!(formatted, Some("6908 4709 28 28".to_string()));
// Generate for a specific state
let voter_id_sp = voter_id::generate(Some("SP")).unwrap();
assert!(voter_id::is_valid(&voter_id_sp));use brazilian_utils::legal_process;
// Validate
assert!(legal_process::is_valid("00000000020248140141"));
// Format
let formatted = legal_process::format_legal_process("00000000020248140141");
assert_eq!(formatted, Some("0000000-00.2024.8.14.0141".to_string()));
// Generate random
let process = legal_process::generate(Some(("8", "14", "0141")));
assert!(legal_process::is_valid(&process.unwrap()));use brazilian_utils::date_utils;
use chrono::NaiveDate;
// Check if date is a holiday
let christmas = NaiveDate::from_ymd_opt(2024, 12, 25).unwrap();
assert!(date_utils::is_holiday(&christmas, None));
// Convert date to text
let date = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();
let text = date_utils::convert_date_to_text(&date);
assert_eq!(text, Some("15 de janeiro de 2024".to_string()));| Module | Functions | Description |
|---|---|---|
boleto |
is_valid, validate |
Bank slip digitable line validation |
cep |
is_valid, format_cep, remove_symbols, generate, get_address_from_cep, get_cep_information_from_address |
Postal code validation and address lookup |
cnh |
is_valid_cnh |
Driver's license validation |
cnpj |
is_valid, validate, format_cnpj, remove_symbols, generate, hashdigit, compute_checksum |
Company registration validation |
cpf |
is_valid, validate, format_cpf, remove_symbols, generate, hashdigit, compute_checksum |
Individual taxpayer validation |
currency |
format_currency, convert_real_to_text, number_to_words |
Currency formatting and text conversion |
date_utils |
is_holiday, convert_date_to_text |
Date utilities and holiday checking |
email |
is_valid |
RFC 5322 email validation |
legal_nature |
is_valid, get_description, list_all |
Legal entity nature codes (60+ codes) |
legal_process |
is_valid, format_legal_process, remove_symbols, generate |
Legal process number validation |
license_plate |
is_valid, format_license_plate, remove_symbols, convert_to_mercosul, get_format, generate |
Vehicle license plate (old/Mercosul) |
phone |
is_valid, format_phone, remove_symbols, generate, remove_international_dialing_code |
Phone number validation |
pis |
is_valid, format_pis, remove_symbols, generate, checksum |
Social integration number |
renavam |
is_valid, generate, calculate_checksum |
Vehicle registration number |
voter_id |
is_valid, format_voter_id, generate, calculate_vd1, calculate_vd2 |
Electoral registration validation |
# Run all tests
cargo test
# Run tests for a specific module
cargo test cpf
# Run with output
cargo test -- --nocaptureThe library includes comprehensive demo examples for each module:
# CPF demonstration
cargo run --example cpf_demo
# CNPJ demonstration
cargo run --example cnpj_demo
# License Plate demonstration
cargo run --example license_plate_demo
# Voter ID demonstration
cargo run --example voter_id_demo
# And many more...- 149 unit tests covering all validation logic
- 55 documentation tests ensuring examples work correctly
- Total: 204 tests with 100% passing rate
rand- Random number generationreqwest- HTTP client for CEP address lookupserde/serde_json- JSON serializationchrono- Date and time handlingregex- Regular expression matchingunicode-normalization- String normalization
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.
Inspired by brazilian-utils/python - A Python library with similar utilities for Brazilian data.