cli dollcode encoder and decoder

add docs and stuff

0xda157 9da86c62 b4f51292

+50 -16
+42 -14
lib-porcelain/src/lib.rs
··· 1 - pub fn dollcode_decode(input: &str) -> u64 { 2 - input.chars().fold(0, |acc, c| { 3 - acc * 3 4 - + match c { 1 + /// Decodes a string slice containing a dollcode into a u64. Returns None if 2 + /// input contains invalid characters (everything expect '▖', '▘', and '▌'). 3 + /// 4 + /// # Example 5 + /// 6 + /// ``` 7 + /// use lib_porcelain::dollcode_decode; 8 + /// 9 + /// assert_eq!(dollcode_decode("▖▖▘▘▌▘▌▌▘▘▘▌▌"), Some(893271)); 10 + /// 11 + /// assert_eq!(dollcode_decode("invalid"), None); 12 + /// ``` 13 + pub fn dollcode_decode(input: &str) -> Option<u64> { 14 + let mut acc = 0; 15 + 16 + for char in input.chars() { 17 + acc = acc * 3 18 + + match char { 5 19 '▖' => 1, 6 20 '▘' => 2, 7 21 '▌' => 3, 8 - _ => unreachable!(), 22 + _ => return None, 9 23 } 10 - }) 24 + } 25 + 26 + Some(acc) 11 27 } 12 28 29 + /// Takes a u64 and encodes in to a String containing a dollcode made up of 30 + /// '▖', '▘', and '▌'. 31 + /// 32 + /// # Example 33 + /// 34 + /// ``` 35 + /// use lib_porcelain::dollcode_encode; 36 + /// 37 + /// assert_eq!(dollcode_encode(893271), "▖▖▘▘▌▘▌▌▘▘▘▌▌"); 38 + /// ``` 13 39 pub fn dollcode_encode(mut input: u64) -> String { 14 40 let mut res = String::new(); 15 41 ··· 35 61 assert_eq!(dollcode_encode(4), "▖▖"); 36 62 assert_eq!(dollcode_encode(13), "▖▖▖"); 37 63 assert_eq!(dollcode_encode(440729), "▖▌▌▌▌▖▖▖▘▌▘▘"); 64 + assert_eq!(dollcode_encode(893271), "▖▖▘▘▌▘▌▌▘▘▘▌▌"); 38 65 assert_eq!( 39 66 dollcode_encode(u64::MAX), 40 67 "▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌" ··· 43 70 44 71 #[test] 45 72 fn test_decode() { 46 - assert_eq!(dollcode_decode(""), 0); 47 - assert_eq!(dollcode_decode("▖"), 1); 48 - assert_eq!(dollcode_decode("▘"), 2); 49 - assert_eq!(dollcode_decode("▌"), 3); 50 - assert_eq!(dollcode_decode("▖▖"), 4); 51 - assert_eq!(dollcode_decode("▖▖▖"), 13); 52 - assert_eq!(dollcode_decode("▖▌▌▌▌▖▖▖▘▌▘▘"), 440729); 73 + assert_eq!(dollcode_decode(""), Some(0)); 74 + assert_eq!(dollcode_decode("▖"), Some(1)); 75 + assert_eq!(dollcode_decode("▘"), Some(2)); 76 + assert_eq!(dollcode_decode("▌"), Some(3)); 77 + assert_eq!(dollcode_decode("▖▖"), Some(4)); 78 + assert_eq!(dollcode_decode("▖▖▖"), Some(13)); 79 + assert_eq!(dollcode_decode("▖▌▌▌▌▖▖▖▘▌▘▘"), Some(440729)); 80 + assert_eq!(dollcode_decode("▖▖▘▘▌▘▌▌▘▘▘▌▌"), Some(893271)); 53 81 assert_eq!( 54 82 dollcode_decode("▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌"), 55 - u64::MAX 83 + Some(u64::MAX) 56 84 ); 57 85 } 58 86 }
+8 -2
src/main.rs
··· 50 50 let dollcode = dmatches.get_one::<String>("dollcode").unwrap(); 51 51 52 52 if matches.get_flag("hex") { 53 - println!("{:X}", dollcode_decode(dollcode)); 53 + println!( 54 + "{:X}", 55 + dollcode_decode(dollcode).expect("dollcodes may only contain '▖', '▘', or '▌'") 56 + ); 54 57 return; 55 58 } 56 59 57 - println!("{}", dollcode_decode(dollcode)); 60 + println!( 61 + "{}", 62 + dollcode_decode(dollcode).expect("dollcodes may only contain '▖', '▘', or '▌'") 63 + ); 58 64 } 59 65 }