# ens-normalize-rs

A Rust implementation of ENS (Ethereum Name Service) name normalization.
## Description
`ens-normalize-rs` is a robust Rust library for normalizing and validating ENS names according to [ENSIP-15](https://docs.ens.domains/ensip/15) specifications. It handles Unicode normalization, validation, beautification of ENS names ensuring correct, consistent and idempotent behavior.
## Installation
```bash
cargo add ens-normalize-rs
```
Or add this to your project using Cargo:
```toml
[dependencies]
ens-normalize-rs = "0.1.1"
```
## Usage
```rust
fn main() {
fn main() {
// Using normalizer to reuse preloaded data
let normalizer = ens_normalize_rs::EnsNameNormalizer::default();
let name = "🅰️🅱.eth";
let processed = normalizer.process(name).unwrap();
let beautified_name = processed.beautify();
let normalized_name = processed.normalize();
assert_eq!(normalized_name, "🅰🅱.eth");
assert_eq!(beautified_name, "🅰️🅱️.eth");
// Using normalize directly
let normalized = normalizer.normalize("Levvv.eth").unwrap();
assert_eq!(normalized, "levvv.eth");
// Handling errors
assert!(matches!(
normalizer.normalize("Levvv..eth"),
Err(ens_normalize_rs::ProcessError::DisallowedSequence(
ens_normalize_rs::DisallowedSequence::EmptyLabel
))
));
assert!(matches!(
// U+200D ZERO WIDTH JOINER
normalizer.normalize("Nick.ETH"),
Err(ens_normalize_rs::ProcessError::DisallowedSequence(
ens_normalize_rs::DisallowedSequence::InvisibleCharacter(0x200d)
))
));
}
}
```
## Testing
Crate contains several types of tests:
- Unit tests
- Integration (e2e) tests -- `tests/e2e.rs`
- [Validation ENS docs tests](https://docs.ens.domains/ensip/15#appendix-validation-tests) -- `tests/ens_tests.rs`
To run all tests simply run:
```
cargo test
```
## Roadmap
- [x] Tokenization
- [x] Normalization
- [x] Beautification
- [x] ENSIP-15 Validation Tests
- [ ] Unicode Normalization Tests
- [ ] CLI to update `specs.json` and `nf.json`
- [ ] analog of [ens_cure](https://github.com/namehash/ens-normalize-python?tab=readme-ov-file#ens_cure) function
- [ ] analog of [ens_normalizations](https://github.com/namehash/ens-normalize-python/tree/main?tab=readme-ov-file#ens_normalizations) function
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.