Mountain/Environment/Utility/
UriParsing.rs1use url::Url;
6use CommonLibrary::Error::CommonError::CommonError;
7
8pub fn GetURLFromURIComponentsDTO(URIDTO:&serde_json::Value) -> Result<Url, CommonError> {
25 if let Some(URIString) = URIDTO.as_str() {
27 return Url::parse(URIString).map_err(|Error| {
28 CommonError::InvalidArgument {
29 ArgumentName:"URIDTO".to_string(),
30 Reason:format!("Failed to parse URI string '{}': {}", URIString, Error),
31 }
32 });
33 }
34
35 if let Some(URIString) = URIDTO.get("external").and_then(serde_json::Value::as_str) {
37 return Url::parse(URIString).map_err(|Error| {
38 CommonError::InvalidArgument {
39 ArgumentName:"URIDTO.external".to_string(),
40 Reason:format!("Failed to parse URI string '{}': {}", URIString, Error),
41 }
42 });
43 }
44
45 let Scheme = URIDTO.get("scheme").and_then(serde_json::Value::as_str);
47 let Path = URIDTO.get("path").and_then(serde_json::Value::as_str);
48 if let (Some(Scheme), Some(Path)) = (Scheme, Path) {
49 let Authority = URIDTO.get("authority").and_then(serde_json::Value::as_str).unwrap_or("");
50 let Query = URIDTO.get("query").and_then(serde_json::Value::as_str).unwrap_or("");
51 let Fragment = URIDTO.get("fragment").and_then(serde_json::Value::as_str).unwrap_or("");
52 let mut Reconstructed = format!("{}://{}{}", Scheme, Authority, Path);
53 if !Query.is_empty() {
54 Reconstructed.push('?');
55 Reconstructed.push_str(Query);
56 }
57 if !Fragment.is_empty() {
58 Reconstructed.push('#');
59 Reconstructed.push_str(Fragment);
60 }
61 return Url::parse(&Reconstructed).map_err(|Error| {
62 CommonError::InvalidArgument {
63 ArgumentName:"URIDTO".to_string(),
64 Reason:format!("Failed to parse reconstructed URI '{}': {}", Reconstructed, Error),
65 }
66 });
67 }
68
69 Err(CommonError::InvalidArgument {
70 ArgumentName:"URIDTO".to_string(),
71 Reason:"Expected a URI string, an object with 'external', or an object with 'scheme' + 'path'".to_string(),
72 })
73}