Skip to content

Commit

Permalink
Make idna no_std compatible
Browse files Browse the repository at this point in the history
Add default feature flag "std" that enables a `std::error::Error` impl for `Errors`.
  • Loading branch information
madsmtm committed Feb 21, 2023
1 parent 1712f6c commit a2845d1
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
10 changes: 8 additions & 2 deletions idna/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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"
Expand Down
12 changes: 12 additions & 0 deletions idna/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
7 changes: 4 additions & 3 deletions idna/src/punycode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
11 changes: 7 additions & 4 deletions idna/src/uts46.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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<std::str::Chars<'static>>,
slice: Option<core::str::Chars<'static>>,
}

impl<'a> Iterator for Mapper<'a> {
Expand Down Expand Up @@ -708,7 +710,8 @@ impl From<Errors> 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 {
Expand Down

0 comments on commit a2845d1

Please sign in to comment.