Home

Awesome

WHATWG URL parser for Rust

Fast WHATWG URL Specification compliant URL parser for Rust. Well-tested and widely used by Node.js since Node 18.

The Ada library passes the full range of tests from the specification, across a wide range of platforms (e.g., Windows, Linux, macOS). It fully supports the relevant Unicode Technical Standard.

Usage

See here for a usage example. You can run it locally with cargo run --example simple. Feel free to adjust it for exploring this crate further.

Features

std: Functionalities that require std. This feature is enabled by default, set no-default-features to true if you want no-std.

serde: Allow Url to work with serde. This feature is disabled by default. Enabling this feature without std would provide you only Serialize. Enabling this feature and std would provide you both Serialize and Deserialize.

libcpp: Build ada-url with libc++. This feature is disabled by default. Enabling this feature without libc++ installed would cause compile error.

Performance

Ada is fast. The benchmark below shows 3.49 times faster URL parsing compared to url

can_parse/ada_url       time:   [1.2109 µs 1.2121 µs 1.2133 µs]
                        thrpt:  [635.09 MiB/s 635.75 MiB/s 636.38 MiB/s]

parse/ada_url           time:   [2.0124 µs 2.0157 µs 2.0190 µs]
                        thrpt:  [381.67 MiB/s 382.28 MiB/s 382.91 MiB/s]

parse/url               time:   [7.0530 µs 7.0597 µs 7.0666 µs]
                        thrpt:  [109.04 MiB/s 109.15 MiB/s 109.25 MiB/s]

Implemented traits

Url implements the following traits.

Trait(s)Description
DisplayProvides to_string and allows for the value to be used in format! macros (e.g. println!).
DebugAllows debugger output in format macros, ({:?} syntax)
PartialEq, EqAllows for comparison, url1 == url2, url1.eq(url2)
PartialOrd, OrdAllows for ordering url1 < url2, done so alphabetically. This is also allows Url to be used as a key in a BTreeMap
HashMakes it so that Url can be hashed based on the string representation. This is important so that Url can be used as a key in a HashMap
FromStrAllows for use with str's parse method
TryFrom<String>, TryFrom<&str>Provides try_into methods for String and &str
Borrow<str>, Borrow<[u8]>Used in some crates so that the Url can be used as a key.
Deref<Target=str>Allows for &Url to dereference as a &str. Also provides a number of string methods
AsRef<[u8]>, AsRef<str>Used to do a cheap reference-to-reference conversion.
SendUsed to declare that the type can be transferred across thread boundaries.
SyncUsed to declare that the type is thread-safe.

Development

justfile

The justfile contains commands (called "recipes") that can be executed by just for convenience.

Run all lints and tests:

just all

Skipping features:

just all --skip=libcpp,serde

License

This code is made available under the Apache License 2.0 as well as the MIT license.

Our tests include third-party code and data. The benchmarking code includes third-party code: it is provided for research purposes only and not part of the library.