eris_rs/
urn.rs

1use crate::types::ReadCapability;
2
3impl ReadCapability {
4    pub fn to_urn(&self) -> String {
5        let base32_alphabet = base32::Alphabet::RFC4648 { padding: false };
6        let bytes = self.to_bytes();
7        let read_capability_base32 = base32::encode(base32_alphabet, &bytes);
8        "urn:eris:".to_owned() + &read_capability_base32
9    }
10
11    pub fn from_urn(urn: String) -> Option<ReadCapability> {
12        let base32_alphabet = base32::Alphabet::RFC4648 { padding: false };
13        match urn.split_once("urn:eris:") {
14            Some((_, reference_base32)) => {
15                match base32::decode(base32_alphabet, reference_base32) {
16                    Some(bytes) => ReadCapability::from_bytes(&bytes),
17                    None => None,
18                }
19            }
20            None => None,
21        }
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28    use crate::tests::vectors::read_positive_test_vectors;
29    use std::convert::TryInto;
30
31    #[test]
32    fn encode() {
33        let test_vectors = read_positive_test_vectors();
34        for vector in test_vectors {
35            println!("Running vector {}", vector.file_name);
36            let capability: ReadCapability = vector.data.read_capability.try_into().unwrap();
37            assert_eq!(capability.to_urn(), vector.data.urn);
38        }
39    }
40
41    #[test]
42    fn decode() {
43        let test_vectors = read_positive_test_vectors();
44        for vector in test_vectors {
45            println!("Running vector {}", vector.file_name);
46            let capability: ReadCapability = vector.data.read_capability.try_into().unwrap();
47
48            let decoded_capability = ReadCapability::from_urn(vector.data.urn).unwrap();
49            assert_eq!(capability, decoded_capability);
50        }
51    }
52}