1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
use phf::phf_map; static DIGITS_SUPERSCRIPT: phf::Map<char, char> = phf_map! { '0' => '⁰', '1' => '¹', '2' => '²', '3' => '³', '4' => '⁴', '5' => '⁵', '6' => '⁶', '7' => '⁷', '8' => '⁸', '9' => '⁹', '+' => '⁺', '-' => '⁻', '=' => '⁼', '(' => '⁽', ')' => '⁾', }; static DIGITS_SUBSCRIPT: phf::Map<char, char> = phf_map! { '0' => '₀', '1' => '₁', '2' => '₂', '3' => '₃', '4' => '₄', '5' => '₅', '6' => '₆', '7' => '₇', '8' => '₈', '9' => '₉', '+' => '₊', '-' => '₋', '=' => '₌', '(' => '₍', ')' => '₎', }; #[derive(Debug, PartialEq)] pub enum Error { InvalidInputCharacter(char), } pub fn microdigitize_superscript(s: &str) -> Result<String, Error> { microdigitize(&DIGITS_SUPERSCRIPT, s) } pub fn microdigitize_subscript(s: &str) -> Result<String, Error> { microdigitize(&DIGITS_SUBSCRIPT, s) } fn microdigitize(char_map: &phf::Map<char, char>, s: &str) -> Result<String, Error> { let mut out: Vec<&char> = Vec::new(); for c in s.chars() { match char_map.get(&c) { Some(c) => out.push(c), None => return Err(Error::InvalidInputCharacter(c)), } } Ok(out.into_iter().collect()) } #[cfg(test)] mod tests { use super::*; #[test] fn test_microdigitize_superscript() { assert_eq!( microdigitize_superscript("123-(456)=+"), Ok("¹²³⁻⁽⁴⁵⁶⁾⁼⁺".to_string()) ); assert_eq!( microdigitize_superscript("12x"), Err(Error::InvalidInputCharacter('x')) ); } #[test] fn test_microdigitize_subscript() { assert_eq!( microdigitize_subscript("123-(456)=+"), Ok("₁₂₃₋₍₄₅₆₎₌₊".to_string()) ); assert_eq!( microdigitize_subscript("12x"), Err(Error::InvalidInputCharacter('x')) ); } }