Enum spinoso_string::CaseFold[][src]

pub enum CaseFold {
    Full,
    Ascii,
    Turkic,
    Lithuanian,
}

Unicode case folding strategies.

Unicode case folding data supports both implementations that require simple case foldings (where string lengths don’t change), and implementations that allow full case folding (where string lengths may grow). Note that where they can be supported, the full case foldings are superior: for example, they allow “MASSE” and “Maße” to match.

The CaseFold enum supports the folding strategies available in Ruby.

Examples

For Unicode text, the default folding schem is Full. To make a comparison:

let fold = CaseFold::Full;
assert_eq!(fold.casecmp("MASSE", "Maße"), Ordering::Equal);
assert_eq!(fold.casecmp("São Paulo", "Sao Paulo"), Ordering::Greater);

assert!(fold.case_eq("MASSE", "Maße"));
assert!(!fold.case_eq("São Paulo", "Sao Paulo"));

For text known to be ASCII, Focaccia can make a more performant comparison check:

let fold = CaseFold::Ascii;
assert_eq!(fold.casecmp("Crate: focaccia", "Crate: FOCACCIA"), Ordering::Equal);
assert_eq!(fold.casecmp("Fabled", "failed"), Ordering::Less);

assert!(fold.case_eq("Crate: focaccia", "Crate: FOCACCIA"));
assert!(!fold.case_eq("Fabled", "failed"));

Turkic case folding is similar to full case folding with additional mappings for dotted and dotless I:

let fold = CaseFold::Turkic;
assert!(matches!(fold.casecmp("İstanbul", "istanbul"), Ordering::Equal));
assert!(!matches!(fold.casecmp("İstanbul", "Istanbul"), Ordering::Equal));

assert!(fold.case_eq("İstanbul", "istanbul"));
assert!(!fold.case_eq("İstanbul", "Istanbul"));

Variants

Full

Full Unicode case mapping, suitable for most languages (see Turkic and Lithuanian strategies for exceptions). Context-dependent case mapping as described in Table 3-14 of the Unicode standard is currently not supported.

Ascii

Only the ASCII region, i.e. the characters “A” to “Z” and “a” to “z”, are affected.

Turkic

Full Unicode case mapping, adapted for Turkic languages (Turkish, Azerbaijani, …). This means that upper case I is mapped to lower case dotless i, and so on.

Lithuanian

Currently, just full Unicode case mapping. In the future, full Unicode case mapping adapted for Lithuanian (keeping the dot on the lower case i even if there is an accent on top).

Implementations

impl CaseFold[src]

#[must_use]pub const fn new() -> CaseFold[src]

Construct a new full Unicode case folding.

See CaseFold::Full.

Examples

const FOLD: CaseFold = CaseFold::new();

assert_eq!(CaseFold::new(), CaseFold::Full);

assert!(CaseFold::new().case_eq("MASSE", "Maße"));
assert!(!CaseFold::new().case_eq("São Paulo", "Sao Paulo"));

#[must_use]pub fn casecmp(self, left: &str, right: &str) -> Ordering[src]

Make a case-insensitive string comparison based on the dispatching folding strategy.

Return Ordering::Equal if the given strings match when folding case. For example, when using CaseFold::Full, ß is considered equal to ss. The differences between the folding strategies are documented on the variants of the CaseFold enum.

This function is a wrapper around the underlying scheme-specific functions.

Examples – Full case folding

let fold = CaseFold::Full;
assert_eq!(fold.casecmp("MASSE", "Maße"), Ordering::Equal);
assert_eq!(fold.casecmp("São Paulo", "Sao Paulo"), Ordering::Greater);

Examples – ASCII case folding

let fold = CaseFold::Ascii;
assert_eq!(fold.casecmp("Crate: focaccia", "Crate: FOCACCIA"), Ordering::Equal);
assert_eq!(fold.casecmp("Fabled", "failed"), Ordering::Less);

Examples – Turkic case folding

let fold = CaseFold::Turkic;
assert!(matches!(fold.casecmp("İstanbul", "istanbul"), Ordering::Equal));
assert!(!matches!(fold.casecmp("İstanbul", "Istanbul"), Ordering::Equal));

#[must_use]pub fn case_eq(self, left: &str, right: &str) -> bool[src]

Make a case-insensitive string equality check based on the dispatching folding strategy.

Return true if the given strings match when folding case. For example, when using CaseFold::Full, ß is considered equal to ss. The differences between the folding strategies are documented on the variants of the CaseFold enum.

This function is a wrapper around the underlying scheme-specific functions.

Examples – Full case folding

let fold = CaseFold::Full;
assert!(fold.case_eq("MASSE", "Maße"));
assert!(!fold.case_eq("São Paulo", "Sao Paulo"));

Examples – ASCII case folding

let fold = CaseFold::Ascii;
assert!(fold.case_eq("Crate: focaccia", "Crate: FOCACCIA"));
assert!(!fold.case_eq("Fabled", "failed"));

Examples – Turkic case folding

let fold = CaseFold::Turkic;
assert!(fold.case_eq("İstanbul", "istanbul"));
assert!(!fold.case_eq("İstanbul", "Istanbul"));

Trait Implementations

impl Clone for CaseFold[src]

impl Copy for CaseFold[src]

impl Debug for CaseFold[src]

impl Default for CaseFold[src]

pub fn default() -> CaseFold[src]

Default to full Unicode case folding.

See CaseFold::Full.

Examples

assert_eq!(CaseFold::default(), CaseFold::Full);

assert!(CaseFold::default().case_eq("MASSE", "Maße"));
assert!(!CaseFold::default().case_eq("São Paulo", "Sao Paulo"));

impl Eq for CaseFold[src]

impl Hash for CaseFold[src]

impl Ord for CaseFold[src]

impl PartialEq<CaseFold> for CaseFold[src]

impl PartialOrd<CaseFold> for CaseFold[src]

impl StructuralEq for CaseFold[src]

impl StructuralPartialEq for CaseFold[src]

impl<'_> TryFrom<Option<&'_ [u8]>> for CaseFold[src]

type Error = NoSuchCaseFoldingScheme

The type returned in the event of a conversion error.

impl<'_> TryFrom<Option<&'_ str>> for CaseFold[src]

type Error = NoSuchCaseFoldingScheme

The type returned in the event of a conversion error.

Auto Trait Implementations

impl RefUnwindSafe for CaseFold

impl Send for CaseFold

impl Sync for CaseFold

impl Unpin for CaseFold

impl UnwindSafe for CaseFold

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.