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
48 let Path = URIDTO.get("path").and_then(serde_json::Value::as_str);
49
50 if let (Some(Scheme), Some(Path)) = (Scheme, Path) {
51 let Authority = URIDTO.get("authority").and_then(serde_json::Value::as_str).unwrap_or("");
52
53 let Query = URIDTO.get("query").and_then(serde_json::Value::as_str).unwrap_or("");
54
55 let Fragment = URIDTO.get("fragment").and_then(serde_json::Value::as_str).unwrap_or("");
56
57 let mut Reconstructed = format!("{}://{}{}", Scheme, Authority, Path);
58
59 if !Query.is_empty() {
60 Reconstructed.push('?');
61
62 Reconstructed.push_str(Query);
63 }
64
65 if !Fragment.is_empty() {
66 Reconstructed.push('#');
67
68 Reconstructed.push_str(Fragment);
69 }
70
71 return Url::parse(&Reconstructed).map_err(|Error| {
72 CommonError::InvalidArgument {
73 ArgumentName:"URIDTO".to_string(),
74 Reason:format!("Failed to parse reconstructed URI '{}': {}", Reconstructed, Error),
75 }
76 });
77 }
78
79 Err(CommonError::InvalidArgument {
80 ArgumentName:"URIDTO".to_string(),
81 Reason:"Expected a URI string, an object with 'external', or an object with 'scheme' + 'path'".to_string(),
82 })
83}