diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2022-11-06 23:53:53 -0800 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2022-11-06 23:53:53 -0800 |
commit | 13b77ec75c5018f17048e2712ca83da3b4bb82dc (patch) | |
tree | ab56810a308f6ca8e676fae470b7a4e436c55ac9 /adenosine-cli/src | |
parent | e3739138455a178e656287d560e0dc793e230da1 (diff) | |
download | adenosine-13b77ec75c5018f17048e2712ca83da3b4bb82dc.tar.gz adenosine-13b77ec75c5018f17048e2712ca83da3b4bb82dc.zip |
identifiers: allow trailing slashes in parts of at:// URIs
Diffstat (limited to 'adenosine-cli/src')
-rw-r--r-- | adenosine-cli/src/identifiers.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/adenosine-cli/src/identifiers.rs b/adenosine-cli/src/identifiers.rs index 8a08ef3..ed9c0fd 100644 --- a/adenosine-cli/src/identifiers.rs +++ b/adenosine-cli/src/identifiers.rs @@ -81,14 +81,14 @@ impl FromStr for AtUri { fn from_str(s: &str) -> Result<Self, Self::Err> { lazy_static! { - static ref ATURI_RE: Regex = Regex::new(r"^at://([a-zA-Z0-9:_\.-]+)(/([a-zA-Z0-9\.]+))?(/([a-zA-Z0-9\.-]+))?(#([a-zA-Z0-9/-]+))?$").unwrap(); + static ref ATURI_RE: Regex = Regex::new(r"^at://([a-zA-Z0-9:_\.-]+)(/(([a-zA-Z0-9\.]+))?)?(/(([a-zA-Z0-9\.-]+))?)?(#([a-zA-Z0-9/-]+))?$").unwrap(); } if let Some(caps) = ATURI_RE.captures(s) { let uri = AtUri { repository: DidOrHost::from_str(&caps[1])?, - collection: caps.get(3).map(|v| v.as_str().to_string()), - record: caps.get(5).map(|v| v.as_str().to_string()), - fragment: caps.get(7).map(|v| v.as_str().to_string()), + collection: caps.get(4).map(|v| v.as_str().to_string()), + record: caps.get(7).map(|v| v.as_str().to_string()), + fragment: caps.get(9).map(|v| v.as_str().to_string()), }; Ok(uri) } else { @@ -116,8 +116,10 @@ impl fmt::Display for AtUri { #[test] fn test_aturi() { assert!(AtUri::from_str("at://bob.com").is_ok()); + assert!(AtUri::from_str("at://bob.com/").is_ok()); assert!(AtUri::from_str("at://did:plc:bv6ggog3tya2z3vxsub7hnal").is_ok()); assert!(AtUri::from_str("at://bob.com/io.example.song").is_ok()); + assert!(AtUri::from_str("at://bob.com/io.example.song/").is_ok()); assert!(AtUri::from_str("at://bob.com/io.example.song/3yI5-c1z-cc2p-1a").is_ok()); assert!(AtUri::from_str("at://bob.com/io.example.song/3yI5-c1z-cc2p-1a#/title").is_ok()); assert!( @@ -143,6 +145,10 @@ fn test_aturi() { assert_eq!(uri.collection, Some("io.example.song".to_string())); assert_eq!(uri.record, Some("3yI5-c1z-cc2p-1a".to_string())); assert_eq!(uri.fragment, Some("/title".to_string())); + + let uri = AtUri::from_str("at://bob.com/io.example.song/").unwrap(); + assert_eq!(uri.repository, DidOrHost::Host("bob.com".to_string())); + assert_eq!(uri.collection, Some("io.example.song".to_string())); } /// A String (newtype) representing an NSID |