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