# Vat ID validator (EU and non-EU countries, with checksums)
**Validate VAT numbers for European Union countries (and several other countries), with checksum verification.**
Many libraries only check if a VAT number *looks* right (regex). `vat_id_validator` checks if it **is** right.
It verifies the **checksum** of the VAT number using country-specific algorithms (Luhn, Modulo 97, weighted sums, etc.). This means you can catch typos, transposed digits, and fake numbers **instantly**, without making a single network request to flaky government APIs like VIES.
### Key Benefits
- **โก Instant & Offline**: Zero network latency. No VIES downtime. Works everywhere.
- **๐งฎ Mathematical Verification**: Catches invalid numbers that regex would pass (e.g., typos).
- **๐ก๏ธ Type-Safe Rust**: Built for speed and reliability.
- **๐ Multi-Country**: Supports 30+ countries including EU, UK, Norway, Switzerland, Serbia, Russia, and Brazil.
## ๐ Key Features
### 1. Explicit Country Validation
Don't guess! If you know the country, validate strictly against it.
```rust
// O(1) lookup - 2.3x faster than standard check!
let result = check_vat_by_country("GB999000005", "GB");
```
### 2. Serde Support
Enable the `serde` feature to serialize results straight to JSON.
```json
{
"value": "GB999000005",
"is_valid": true,
"is_valid_format": true,
"is_supported_country": true,
"country_name": "United Kingdom"
}
```
### 3. Country Identifier (GeoGuesser Mode)
Got a number but don't know where it's from?
```rust
use vat_id_validator::identify_country;
// Returns valid results for ALL matching countries
let matches = identify_country("999000005");
// Matches:
// - United Kingdom (it tries adding "GB" automatically!)
// - Any other country where "999000005" is valid
## Installation
Add this to your `Cargo.toml`:
```toml
[dependencies]
vat_id_validator = { version = "0.2.0", features = ["serde"] }
```
## Usage
```rust
use vat_id_validator::check_vat;
fn main() {
// Valid UK VAT number
assert!(check_vat("GB999000005").is_valid);
// Invalid format
assert!(!check_vat("GB123").is_valid);
// Valid format but invalid checksum
assert!(!check_vat("GB999999974").is_valid);
}
```
## ๐๏ธ Benchmarks
We take "instant" seriously.
| `check_vat` (heuristic) | ~1.06 ยตs |
| `check_vat_by_country` (direct) | **~460 ns** |
*Measured on M-series Mac. Your mileage may vary, but it will be fast.*
## Supported Countries
* Andorra (AD)
* Austria (AT)
* Belgium (BE)
* Brazil (BR)
* Bulgaria (BG)
* Croatia (HR)
* Cyprus (CY)
* Czech Republic (CZ)
* Denmark (DK)
* Estonia (EE)
* Finland (FI)
* France (FR)
* Germany (DE)
* Greece (GR)
* Hungary (HU)
* Ireland (IE)
* Italy (IT)
* Latvia (LV)
* Lithuania (LT)
* Luxembourg (LU)
* Malta (MT)
* Netherlands (NL)
* Norway (NO)
* Poland (PL)
* Portugal (PT)
* Romania (RO)
* Russia (RU)
* Serbia (RS)
* Slovakia (SK)
* Slovenia (SI)
* Spain (ES)
* Sweden (SE)
* Switzerland (CH)
* United Kingdom (GB)
## License
MIT / Apache-2.0