From 730cc02d7aeffdf6a64d898452f4c3c6208fb138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Sun, 31 Mar 2024 16:59:30 +0200 Subject: [PATCH] fix(base): null attribute deserializes correctly also add type address de/serialization tests --- base/src/addressing.rs | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/base/src/addressing.rs b/base/src/addressing.rs index e960b00..56f9094 100644 --- a/base/src/addressing.rs +++ b/base/src/addressing.rs @@ -103,12 +103,14 @@ impl Address { UP_UUID => Ok(Address::Uuid( Uuid::from_slice(digest.as_slice()).map_err(UpEndError::from_any)?, )), - UP_ATTRIBUTE => Ok(Address::Attribute( - String::from_utf8(digest) - .map_err(UpEndError::from_any)? - .as_str() - .parse()?, - )), + UP_ATTRIBUTE => { + let attribute = String::from_utf8(digest).map_err(UpEndError::from_any)?; + if attribute.is_empty() { + Ok(Address::Attribute(Attribute::null())) + } else { + Ok(Address::Attribute(attribute.parse()?)) + } + } UP_URL => Ok(Address::Url( Url::parse(&String::from_utf8(digest).map_err(UpEndError::from_any)?) .map_err(UpEndError::from_any)?, @@ -255,6 +257,9 @@ mod tests { use uuid::Uuid; use crate::addressing::{Address, IDENTITY}; + use crate::constants::{ + TYPE_ATTRIBUTE_ADDRESS, TYPE_HASH_ADDRESS, TYPE_URL_ADDRESS, TYPE_UUID_ADDRESS, + }; use crate::hash::{LargeMultihash, UpMultihash}; use super::UpEndError; @@ -267,6 +272,11 @@ mod tests { let encoded = addr.encode()?; let decoded = Address::decode(&encoded)?; assert_eq!(addr, decoded); + + let addr = &*TYPE_HASH_ADDRESS; + let encoded = addr.encode()?; + let decoded = Address::decode(&encoded)?; + assert_eq!(addr, &decoded); Ok(()) } @@ -276,6 +286,11 @@ mod tests { let encoded = addr.encode()?; let decoded = Address::decode(&encoded)?; assert_eq!(addr, decoded); + + let addr = &*TYPE_UUID_ADDRESS; + let encoded = addr.encode()?; + let decoded = Address::decode(&encoded)?; + assert_eq!(addr, &decoded); Ok(()) } @@ -285,6 +300,11 @@ mod tests { let encoded = addr.encode()?; let decoded = Address::decode(&encoded)?; assert_eq!(addr, decoded); + + let addr = &*TYPE_ATTRIBUTE_ADDRESS; + let encoded = addr.encode()?; + let decoded = Address::decode(&encoded)?; + assert_eq!(addr, &decoded); Ok(()) } @@ -294,6 +314,11 @@ mod tests { let encoded = addr.encode()?; let decoded = Address::decode(&encoded)?; assert_eq!(addr, decoded); + + let addr = &*TYPE_URL_ADDRESS; + let encoded = addr.encode()?; + let decoded = Address::decode(&encoded)?; + assert_eq!(addr, &decoded); Ok(()) } }