glib/
checksum.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use libc::size_t;
4
5use crate::{ffi, translate::*, Checksum};
6
7impl Checksum {
8    #[doc(alias = "g_checksum_get_digest")]
9    #[doc(alias = "get_digest")]
10    pub fn digest(self) -> Vec<u8> {
11        unsafe {
12            //Don't forget update when `ChecksumType` contains type bigger that Sha512.
13            let mut digest_len: size_t = 512 / 8;
14            let mut vec = Vec::with_capacity(digest_len as _);
15
16            ffi::g_checksum_get_digest(
17                mut_override(self.to_glib_none().0),
18                vec.as_mut_ptr(),
19                &mut digest_len,
20            );
21
22            vec.set_len(digest_len);
23            vec
24        }
25    }
26
27    #[doc(alias = "g_checksum_get_string")]
28    #[doc(alias = "get_string")]
29    pub fn string(self) -> Option<String> {
30        unsafe {
31            from_glib_none(ffi::g_checksum_get_string(mut_override(
32                self.to_glib_none().0,
33            )))
34        }
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use crate::{Checksum, ChecksumType};
41
42    const CS_TYPE: ChecksumType = ChecksumType::Md5;
43    const CS_VALUE: &str = "fc3ff98e8c6a0d3087d515c0473f8677";
44    const CS_SLICE: &[u8] = &[
45        0xfc, 0x3f, 0xf9, 0x8e, 0x8c, 0x6a, 0x0d, 0x30, 0x87, 0xd5, 0x15, 0xc0, 0x47, 0x3f, 0x86,
46        0x77,
47    ];
48
49    #[test]
50    fn update() {
51        let mut cs = Checksum::new(CS_TYPE).unwrap();
52        cs.update(b"hello world!");
53        assert_eq!(cs.string().unwrap(), CS_VALUE);
54    }
55
56    #[test]
57    fn update_multi_call() {
58        let mut cs = Checksum::new(CS_TYPE).unwrap();
59        cs.update(b"hello ");
60        cs.update(b"world!");
61        assert_eq!(cs.string().unwrap(), CS_VALUE);
62    }
63
64    #[test]
65    #[doc(alias = "get_digest")]
66    fn digest() {
67        let mut cs = Checksum::new(CS_TYPE).unwrap();
68        cs.update(b"hello world!");
69        let vec = cs.digest();
70        assert_eq!(vec, CS_SLICE);
71    }
72}