colorid/
lib.rs

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    // simple
67    () => {
68        $crate::default()
69    };
70
71    // size
72    ($size:expr) => {
73        $crate::colorid($size)
74    };
75}