1pub mod rng;
2
3mod hex;
4
5pub fn default() -> String {
6 let buffer: [u8; 12] = rng::default();
7 let mut id: [u8; 31] = [hex::DASH; 31];
8 for i in 0..4 {
9 let r = hex::hex(buffer[i * 3]);
10 let g = hex::hex(buffer[i * 3 + 1]);
11 let b = hex::hex(buffer[i * 3 + 2]);
12 id[i * 8] = hex::NUMBER_SIGN;
13 id[i * 8 + 1] = r[0];
14 id[i * 8 + 2] = r[1];
15 id[i * 8 + 3] = g[0];
16 id[i * 8 + 4] = g[1];
17 id[i * 8 + 5] = b[0];
18 id[i * 8 + 6] = b[1];
19 }
20 unsafe {
21 std::str::from_utf8_unchecked_mut(&mut id).to_owned()
22 }
23}
24
25pub fn colorid(count: usize) -> String {
26 assert!(count > 0, "The count should at least greater than 0");
27
28 let buffer: Vec<u8> = rng::generate(count * 3);
29 let mut id: Vec<u8> = vec![hex::DASH; count * 8 - 1];
30 for i in 0..count {
31 let r = hex::hex(buffer[i * 3]);
32 let g = hex::hex(buffer[i * 3 + 1]);
33 let b = hex::hex(buffer[i * 3 + 2]);
34 id[i * 8] = hex::NUMBER_SIGN;
35 id[i * 8 + 1] = r[0];
36 id[i * 8 + 2] = r[1];
37 id[i * 8 + 3] = g[0];
38 id[i * 8 + 4] = g[1];
39 id[i * 8 + 5] = b[0];
40 id[i * 8 + 6] = b[1];
41 }
42 unsafe {
43 std::str::from_utf8_unchecked_mut(&mut id).to_owned()
44 }
45}
46
47#[cfg(test)]
48mod test_color {
49 use super::*;
50
51 #[test]
52 fn test_colorid() {
53 assert_eq!(colorid!().len(), 31);
54 assert_eq!(colorid(5).len(), 39);
55 }
56
57 #[test]
58 #[should_panic]
59 fn test_invalid_colorid() {
60 let _ = colorid(0);
61 }
62}
63
64#[macro_export]
65macro_rules! colorid {
66 () => {
68 $crate::default()
69 };
70
71 ($size:expr) => {
73 $crate::colorid($size)
74 };
75}