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 { 5 '▖' => 1, 6 '▘' => 2, 7 '▌' => 3, 8 - _ => unreachable!(), 9 } 10 - }) 11 } 12 13 pub fn dollcode_encode(mut input: u64) -> String { 14 let mut res = String::new(); 15 ··· 35 assert_eq!(dollcode_encode(4), "▖▖"); 36 assert_eq!(dollcode_encode(13), "▖▖▖"); 37 assert_eq!(dollcode_encode(440729), "▖▌▌▌▌▖▖▖▘▌▘▘"); 38 assert_eq!( 39 dollcode_encode(u64::MAX), 40 "▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌" ··· 43 44 #[test] 45 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); 53 assert_eq!( 54 dollcode_decode("▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌"), 55 - u64::MAX 56 ); 57 } 58 }
··· 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 { 19 '▖' => 1, 20 '▘' => 2, 21 '▌' => 3, 22 + _ => return None, 23 } 24 + } 25 + 26 + Some(acc) 27 } 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 + /// ``` 39 pub fn dollcode_encode(mut input: u64) -> String { 40 let mut res = String::new(); 41 ··· 61 assert_eq!(dollcode_encode(4), "▖▖"); 62 assert_eq!(dollcode_encode(13), "▖▖▖"); 63 assert_eq!(dollcode_encode(440729), "▖▌▌▌▌▖▖▖▘▌▘▘"); 64 + assert_eq!(dollcode_encode(893271), "▖▖▘▘▌▘▌▌▘▘▘▌▌"); 65 assert_eq!( 66 dollcode_encode(u64::MAX), 67 "▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌" ··· 70 71 #[test] 72 fn test_decode() { 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)); 81 assert_eq!( 82 dollcode_decode("▖▖▖▖▘▘▖▘▌▘▘▖▘▘▖▖▘▌▌▖▖▌▌▌▖▌▖▖▌▖▌▌▖▌▌▘▖▖▘▖▌"), 83 + Some(u64::MAX) 84 ); 85 } 86 }
+8 -2
src/main.rs
··· 50 let dollcode = dmatches.get_one::<String>("dollcode").unwrap(); 51 52 if matches.get_flag("hex") { 53 - println!("{:X}", dollcode_decode(dollcode)); 54 return; 55 } 56 57 - println!("{}", dollcode_decode(dollcode)); 58 } 59 }
··· 50 let dollcode = dmatches.get_one::<String>("dollcode").unwrap(); 51 52 if matches.get_flag("hex") { 53 + println!( 54 + "{:X}", 55 + dollcode_decode(dollcode).expect("dollcodes may only contain '▖', '▘', or '▌'") 56 + ); 57 return; 58 } 59 60 + println!( 61 + "{}", 62 + dollcode_decode(dollcode).expect("dollcodes may only contain '▖', '▘', or '▌'") 63 + ); 64 } 65 }