tangled
alpha
login
or
join now
da157.id
/
porcelain
0
fork
atom
cli dollcode encoder and decoder
0
fork
atom
overview
issues
pulls
pipelines
add docs and stuff
0xda157
3 months ago
9da86c62
b4f51292
+50
-16
2 changed files
expand all
collapse all
unified
split
lib-porcelain
src
lib.rs
src
main.rs
+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 {
0
0
0
0
0
0
0
0
0
0
0
0
0
0
5
'▖' => 1,
6
'▘' => 2,
7
'▌' => 3,
8
-
_ => unreachable!(),
9
}
10
-
})
0
0
11
}
12
0
0
0
0
0
0
0
0
0
0
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), "▖▌▌▌▌▖▖▖▘▌▘▘");
0
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);
0
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));
0
0
0
54
return;
55
}
56
57
-
println!("{}", dollcode_decode(dollcode));
0
0
0
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
}