use-ascii 0.1.0

ASCII detection and classification helpers for RustUse
Documentation
#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AsciiKind {
    Alphabetic,
    Numeric,
    Alphanumeric,
    Whitespace,
    Control,
    Punctuation,
    Other,
}

#[must_use]
pub fn is_ascii(input: &str) -> bool {
    input.is_ascii()
}

#[must_use]
pub fn is_ascii_alpha(input: &str) -> bool {
    !input.is_empty()
        && input
            .chars()
            .all(|character| character.is_ascii_alphabetic())
}

#[must_use]
pub fn is_ascii_numeric(input: &str) -> bool {
    !input.is_empty() && input.chars().all(|character| character.is_ascii_digit())
}

#[must_use]
pub fn is_ascii_alphanumeric(input: &str) -> bool {
    !input.is_empty()
        && input
            .chars()
            .all(|character| character.is_ascii_alphanumeric())
}

#[must_use]
pub fn is_ascii_whitespace_only(input: &str) -> bool {
    !input.is_empty()
        && input
            .chars()
            .all(|character| character.is_ascii_whitespace())
}

#[must_use]
pub fn contains_non_ascii(input: &str) -> bool {
    !input.is_ascii()
}

#[must_use]
pub fn strip_non_ascii(input: &str) -> String {
    input
        .chars()
        .filter(|character| character.is_ascii())
        .collect()
}

#[must_use]
pub fn replace_non_ascii(input: &str, replacement: char) -> String {
    input
        .chars()
        .map(|character| {
            if character.is_ascii() {
                character
            } else {
                replacement
            }
        })
        .collect()
}

#[must_use]
pub fn ascii_kind(c: char) -> AsciiKind {
    if !c.is_ascii() {
        return AsciiKind::Other;
    }

    if c.is_ascii_alphabetic() {
        return AsciiKind::Alphabetic;
    }

    if c.is_ascii_digit() {
        return AsciiKind::Numeric;
    }

    if c.is_ascii_alphanumeric() {
        return AsciiKind::Alphanumeric;
    }

    if c.is_ascii_whitespace() {
        return AsciiKind::Whitespace;
    }

    if c.is_ascii_control() {
        return AsciiKind::Control;
    }

    if c.is_ascii_punctuation() {
        return AsciiKind::Punctuation;
    }

    AsciiKind::Other
}