#domain #tld #data-file #etld


Crate for efficient determination of eTLD+1 based on the Mozilla Public Suffix List

2 releases

0.1.1 Dec 14, 2023
0.1.0 Jul 28, 2023

#284 in Web programming

Download history 870/week @ 2023-12-23 1100/week @ 2023-12-30 1292/week @ 2024-01-06 1542/week @ 2024-01-13 1653/week @ 2024-01-20 1440/week @ 2024-01-27 1190/week @ 2024-02-03 1219/week @ 2024-02-10 1747/week @ 2024-02-17 1594/week @ 2024-02-24 2711/week @ 2024-03-02 1675/week @ 2024-03-09 2037/week @ 2024-03-16 2822/week @ 2024-03-23 1745/week @ 2024-03-30 1828/week @ 2024-04-06

8,627 downloads per month
Used in 2 crates (via passkey-client)


21K SLoC

public-suffix by 1Password

github version documentation

The public-suffix crate provides a compact and efficient way to determine the effective TLD-plus-one of any given domain.

This crate is driven by a data file, held in public-suffix-list.dat and contains code to generate Rust structures to represent this information in code.

Using this Crate

You can use this crate directly, using the included DEFAULT_PROVIDER list as follows:

let domain = "sainsburys.co.uk";
let etld = DEFAULT_PROVIDER.effective_tld_plus_one(domain);

Generating a Custom Public Suffix List

It may be that users of this crate wish to compute eTLD+1 differently for certain domains according to the needs of their particular application.

To do this, provide your own version of public_suffix_list.dat and run the included generator script (gen.sh) with the contents of your custom TLD file.

This will regenerate the Rust representations of that data for inclusion in your own crate. The main.go program called by gen.sh supports various arguments to control its output. The main arguments you may wish to use are:

  • --output-path - directory in which to place the generated files.
  • --base-name - the base name of the generated files. The generator will create ${base-name}.rs and ${base-name}_test.rs in the directory specified by output-path.
  • --struct - the name of the Rust struct that will be generated to represent your custom TLD data.
  • --crate - a boolean controlling whether the struct will be created as public_suffix::StructName (if true) or crate::StructName (if false). When you are creating your own structs, always set this to false.

Using Your Custom Public Suffix List

Next, in your Cargo.toml, disable the default-provider feature in this crate: default-features = false. Doing so will remove the built-in implementation of the public suffix list structure and instead you can use your own:

type PublicSuffixList = ListProvider<my_custom_tld_list::MyCustomTldListStruct>;

pub const MY_CUSTOM_TLD_LIST: PublicSuffixList = PublicSuffixList::new();

...then you can call the same functions on MY_CUSTOM_TLD_LIST:

let domain = "sainsburys.co.uk";
let etld = MY_CUSTOM_TLD_LIST.effective_tld_plus_one(domain);

Contributing and feedback

public-suffix is an open source project.

🐛 If you find an issue you'd like to report, or otherwise have feedback, please file a new Issue.

🧑‍💻 If you'd like to contribute to the code please start by filing or commenting on an Issue so we can track the work.


Made with ❤️ and ☕ by the 1Password team.

Get a free 1Password account for your open source project

Does your team need a secure way to manage passwords and other credentials for your open source project? Head on over to our other repository to get a 1Password Teams account on us:

1Password for Open Source Projects


Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

No runtime deps