Skip to main content

qr_code_styling/types/
mode.rs

1//! QR code encoding mode variants.
2
3/// Encoding mode for QR code data.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum Mode {
7    /// Numeric mode (0-9).
8    Numeric,
9    /// Alphanumeric mode (0-9, A-Z, space, $%*+-./: ).
10    Alphanumeric,
11    /// Byte mode (any 8-bit data).
12    Byte,
13    /// Kanji mode.
14    Kanji,
15}
16
17impl Mode {
18    /// Auto-detect the best encoding mode for the given data.
19    pub fn detect(data: &str) -> Mode {
20        if data.chars().all(|c| c.is_ascii_digit()) {
21            Mode::Numeric
22        } else if data.chars().all(|c| {
23            c.is_ascii_digit()
24                || c.is_ascii_uppercase()
25                || matches!(c, ' ' | '$' | '%' | '*' | '+' | '-' | '.' | '/' | ':')
26        }) {
27            Mode::Alphanumeric
28        } else {
29            Mode::Byte
30        }
31    }
32}