lib.rs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright 2016 The rust-url developers.
  2. //
  3. // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
  4. // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
  5. // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
  6. // option. This file may not be copied, modified, or distributed
  7. // except according to those terms.
  8. //! This Rust crate implements IDNA
  9. //! [per the WHATWG URL Standard](https://url.spec.whatwg.org/#idna).
  10. //!
  11. //! It also exposes the underlying algorithms from [*Unicode IDNA Compatibility Processing*
  12. //! (Unicode Technical Standard #46)](http://www.unicode.org/reports/tr46/)
  13. //! and [Punycode (RFC 3492)](https://tools.ietf.org/html/rfc3492).
  14. //!
  15. //! Quoting from [UTS #46’s introduction](http://www.unicode.org/reports/tr46/#Introduction):
  16. //!
  17. //! > Initially, domain names were restricted to ASCII characters.
  18. //! > A system was introduced in 2003 for internationalized domain names (IDN).
  19. //! > This system is called Internationalizing Domain Names for Applications,
  20. //! > or IDNA2003 for short.
  21. //! > This mechanism supports IDNs by means of a client software transformation
  22. //! > into a format known as Punycode.
  23. //! > A revision of IDNA was approved in 2010 (IDNA2008).
  24. //! > This revision has a number of incompatibilities with IDNA2003.
  25. //! >
  26. //! > The incompatibilities force implementers of client software,
  27. //! > such as browsers and emailers,
  28. //! > to face difficult choices during the transition period
  29. //! > as registries shift from IDNA2003 to IDNA2008.
  30. //! > This document specifies a mechanism
  31. //! > that minimizes the impact of this transition for client software,
  32. //! > allowing client software to access domains that are valid under either system.
  33. #[macro_use]
  34. extern crate matches;
  35. pub mod punycode;
  36. mod uts46;
  37. pub use crate::uts46::{Config, Errors, Idna};
  38. /// The [domain to ASCII](https://url.spec.whatwg.org/#concept-domain-to-ascii) algorithm.
  39. ///
  40. /// Return the ASCII representation a domain name,
  41. /// normalizing characters (upper-case to lower-case and other kinds of equivalence)
  42. /// and using Punycode as necessary.
  43. ///
  44. /// This process may fail.
  45. pub fn domain_to_ascii(domain: &str) -> Result<String, uts46::Errors> {
  46. Config::default().to_ascii(domain)
  47. }
  48. /// The [domain to ASCII](https://url.spec.whatwg.org/#concept-domain-to-ascii) algorithm,
  49. /// with the `beStrict` flag set.
  50. pub fn domain_to_ascii_strict(domain: &str) -> Result<String, uts46::Errors> {
  51. Config::default()
  52. .use_std3_ascii_rules(true)
  53. .verify_dns_length(true)
  54. .to_ascii(domain)
  55. }
  56. /// The [domain to Unicode](https://url.spec.whatwg.org/#concept-domain-to-unicode) algorithm.
  57. ///
  58. /// Return the Unicode representation of a domain name,
  59. /// normalizing characters (upper-case to lower-case and other kinds of equivalence)
  60. /// and decoding Punycode as necessary.
  61. ///
  62. /// This may indicate [syntax violations](https://url.spec.whatwg.org/#syntax-violation)
  63. /// but always returns a string for the mapped domain.
  64. pub fn domain_to_unicode(domain: &str) -> (String, Result<(), uts46::Errors>) {
  65. Config::default().to_unicode(domain)
  66. }