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}