From a2845d111fec57329888e029f02a332fdfe40e25 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 21 Feb 2023 06:42:16 +0100 Subject: [PATCH] Make idna no_std compatible Add default feature flag "std" that enables a `std::error::Error` impl for `Errors`. --- idna/Cargo.toml | 10 ++++++++-- idna/src/lib.rs | 12 ++++++++++++ idna/src/punycode.rs | 7 ++++--- idna/src/uts46.rs | 11 +++++++---- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/idna/Cargo.toml b/idna/Cargo.toml index 942f1222a..82d429ea2 100644 --- a/idna/Cargo.toml +++ b/idna/Cargo.toml @@ -3,6 +3,7 @@ name = "idna" version = "0.3.0" authors = ["The rust-url developers"] description = "IDNA (Internationalizing Domain Names in Applications) and Punycode." +categories = ["no_std"] repository = "https://github.com/servo/rust-url/" license = "MIT OR Apache-2.0" autotests = false @@ -12,6 +13,11 @@ rust-version = "1.51" [lib] doctest = false +[features] +default = ["std"] +std = ["alloc", "unicode-bidi/std", "unicode-normalization/std"] +alloc = [] + [[test]] name = "tests" harness = false @@ -26,8 +32,8 @@ tester = "0.9" serde_json = "1.0" [dependencies] -unicode-bidi = "0.3" -unicode-normalization = "0.1.17" +unicode-bidi = { version = "0.3.7", default-features = false } +unicode-normalization = { version = "0.1.17", default-features = false } [[bench]] name = "all" diff --git a/idna/src/lib.rs b/idna/src/lib.rs index 37d638741..909fb1dd1 100644 --- a/idna/src/lib.rs +++ b/idna/src/lib.rs @@ -31,11 +31,23 @@ //! > This document specifies a mechanism //! > that minimizes the impact of this transition for client software, //! > allowing client software to access domains that are valid under either system. +#![no_std] + +// For forwards compatibility +#[cfg(feature = "std")] +extern crate std; + +extern crate alloc; + +#[cfg(not(feature = "alloc"))] +compile_error!("the `alloc` feature must currently be enabled"); #[cfg(test)] #[macro_use] extern crate assert_matches; +use alloc::string::String; + pub mod punycode; mod uts46; diff --git a/idna/src/punycode.rs b/idna/src/punycode.rs index 21955f359..faef379ca 100644 --- a/idna/src/punycode.rs +++ b/idna/src/punycode.rs @@ -13,8 +13,9 @@ //! `encode_str` and `decode_to_string` provide convenience wrappers //! that convert from and to Rust’s UTF-8 based `str` and `String` types. -use std::char; -use std::u32; +use alloc::{string::String, vec::Vec}; +use core::char; +use core::u32; // Bootstring parameters for Punycode static BASE: u32 = 36; @@ -168,7 +169,7 @@ impl Decoder { } pub(crate) struct Decode<'a> { - base: std::str::Chars<'a>, + base: core::str::Chars<'a>, pub(crate) insertions: &'a [(usize, char)], inserted: usize, position: usize, diff --git a/idna/src/uts46.rs b/idna/src/uts46.rs index dc832fc49..fb39c1512 100644 --- a/idna/src/uts46.rs +++ b/idna/src/uts46.rs @@ -11,7 +11,9 @@ use self::Mapping::*; use crate::punycode; -use std::{error::Error as StdError, fmt}; + +use alloc::string::String; +use core::fmt; use unicode_bidi::{bidi_class, BidiClass}; use unicode_normalization::char::is_combining_mark; use unicode_normalization::{is_nfc, UnicodeNormalization}; @@ -70,10 +72,10 @@ fn find_char(codepoint: char) -> &'static Mapping { } struct Mapper<'a> { - chars: std::str::Chars<'a>, + chars: core::str::Chars<'a>, config: Config, errors: &'a mut Errors, - slice: Option>, + slice: Option>, } impl<'a> Iterator for Mapper<'a> { @@ -708,7 +710,8 @@ impl From for Result<(), Errors> { } } -impl StdError for Errors {} +#[cfg(feature = "std")] +impl std::error::Error for Errors {} impl fmt::Display for Errors { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {