dsntk_common/namespace.rs
1//! # Conversion utilities for namespaces
2
3use url::Url;
4
5/// Converts an URI into its RDNN-like equivalent.
6///
7/// Unless the input namespace URI is invalid or does not contain a domain name,
8/// this function returns its RDNN-like equivalent. Domain name segments are reversed,
9/// path segments order is preserved, all segments are joined with
10/// the forward slash `/` character.
11///
12/// Returns `None` for namespace URIs that can not be converted to its RDNN-like equivalent.
13///
14/// # Examples
15///
16/// ```
17/// use dsntk_common::to_rdnn;
18///
19/// let rdnn = to_rdnn("https://dsntk.io/system-1/component-1");
20/// assert_eq!(Some("io/dsntk/system-1/component-1".to_string()), rdnn);
21///
22/// let rdnn = to_rdnn("https://dsntk.io");
23/// assert_eq!(Some("io/dsntk".to_string()), rdnn);
24///
25/// let rdnn = to_rdnn("dsntk.io");
26/// assert_eq!(None, rdnn);
27///
28/// ```
29pub fn to_rdnn(input: &str) -> Option<String> {
30 let Ok(url) = Url::parse(input) else {
31 return None;
32 };
33 let segments = url.path_segments()?;
34 let mut path_segments = segments.map(|s| s.trim()).filter(|s| !s.is_empty()).collect::<Vec<&str>>();
35 let domain = url.domain()?;
36 let mut domain_segments = domain.split('.').collect::<Vec<&str>>();
37 domain_segments.reverse();
38 domain_segments.append(&mut path_segments);
39 Some(domain_segments.join("/"))
40}