#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Table {
Full, AlphanumSpaceSlash, AlphanumSpace, LettersSpace, Alphanum, Numeric, }
pub fn nchar(c: char, table: Table) -> Option<u8> {
let mut n: i32 = 0;
if table != Table::Alphanum && table != Table::Numeric {
if c == ' ' {
return Some(n as u8);
}
n += 1;
}
if table != Table::LettersSpace {
if c.is_ascii_digit() {
return Some((n + (c as i32 - '0' as i32)) as u8);
}
n += 10;
}
if table != Table::Numeric {
if c.is_ascii_uppercase() {
return Some((n + (c as i32 - 'A' as i32)) as u8);
}
n += 26;
}
match table {
Table::Full => match c {
'+' => Some(n as u8),
'-' => Some((n + 1) as u8),
'.' => Some((n + 2) as u8),
'/' => Some((n + 3) as u8),
'?' => Some((n + 4) as u8),
_ => None,
},
Table::AlphanumSpaceSlash => {
if c == '/' {
Some(n as u8)
} else {
None
}
}
_ => None,
}
}
pub fn charn(n: u8, table: Table) -> char {
let mut n = n as i32;
if table != Table::Alphanum && table != Table::Numeric {
if n == 0 {
return ' ';
}
n -= 1;
}
if table != Table::LettersSpace {
if n < 10 {
return char::from_u32('0' as u32 + n as u32).unwrap();
}
n -= 10;
}
if table != Table::Numeric {
if n < 26 {
return char::from_u32('A' as u32 + n as u32).unwrap();
}
n -= 26;
}
match table {
Table::Full => "+-./?".chars().nth(n as usize).unwrap_or('_'),
Table::AlphanumSpaceSlash if n == 0 => '/',
_ => '_',
}
}