Skip to main content

gobby_code/
utils.rs

1use sha2::{Digest, Sha256};
2
3pub fn api_key_fingerprint(api_key: &str) -> String {
4    let digest = Sha256::digest(api_key.as_bytes());
5    let mut fingerprint = String::with_capacity(16);
6    for byte in &digest[..8] {
7        use std::fmt::Write as _;
8        let _ = write!(fingerprint, "{byte:02x}");
9    }
10    fingerprint
11}
12
13pub fn short_id(id: &str) -> String {
14    id.chars().take(8).collect()
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn short_id_truncates_long_ids() {
23        assert_eq!(short_id("1234567890"), "12345678");
24    }
25
26    #[test]
27    fn short_id_returns_input_for_short_strings() {
28        assert_eq!(short_id("abc"), "abc");
29    }
30
31    #[test]
32    fn short_id_returns_input_for_exact_length() {
33        assert_eq!(short_id("12345678"), "12345678");
34    }
35
36    #[test]
37    fn short_id_handles_unicode() {
38        let value = "\u{00e9}".repeat(9);
39        let expected = "\u{00e9}".repeat(8);
40        assert_eq!(short_id(&value), expected);
41    }
42
43    #[test]
44    fn api_key_fingerprint_uses_stable_short_sha256() {
45        assert_eq!(api_key_fingerprint("secret-key"), "85dbe15d75ef9308");
46    }
47}