///|
/// A small demonstration of the `marianoguerra/uri` package: it parses the URI
/// references given on the command line, or a few examples if there are none,
/// and prints their components together with their normalized form.
fn main {
let inputs = [
"foo://user@example.com:8042/over/there?name=ferret#nose", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d",
"//[0000:0000:0000::1]:8080", "../relative/path", "not a uri",
]
for input in inputs {
println("input: \{input}")
try {
let r = @uri.UriRef::parse(input)
println(" scheme: \{show_opt(r.scheme.map(s => s.as_str()))}")
match r.authority {
None => println(" authority: -")
Some(a) => {
println(" authority: \{a.as_str()}")
println(" userinfo: \{show_opt(a.userinfo.map(v => v.as_str()))}")
println(" host: \{a.host} (\{a.host_parsed})")
println(" port: \{show_opt(a.port.map(v => v.as_str()))}")
}
}
println(" path: \{r.path}")
println(" query: \{show_opt(r.query.map(v => v.as_str()))}")
println(" fragment: \{show_opt(r.fragment.map(v => v.as_str()))}")
println(" normalized: \{r.normalize()}")
} catch {
e => println(" error: \{e}")
}
}
}
///|
/// Renders an optional component.
fn show_opt(s : String?) -> String {
match s {
Some(v) => v
None => "-"
}
}