// parse_header — Example: parse an RFC 8288 `Link` header field value and
// print each parsed link.
//
// Run:
// moon run examples/parse_header
// moon run examples/parse_header -- --input "; rel=\"next\"; title=\"Page 2\""
//
// The first token of `@env.args()` is the executable path, so the input is
// the second token when present; otherwise a built-in sample is used.
///|
fn main {
let input = pick_input(@env.args())
match @weblink.parse_link_header(input, @weblink.Limits::default()) {
Ok(links) => {
for i = 0; i < links.length(); i = i + 1 {
let link = links[i]
println("link \{i}: <\{link.target()}>; rel=\"\{relation_list(link)}\"")
match link.title() {
Some(t) => println(" title: \{t}")
None => ()
}
match link.media_type() {
Some(t) => println(" type: \{t}")
None => ()
}
for hl in link.hreflang() {
println(" hreflang: \{hl}")
}
}
println("parsed \{links.length()} link(s)")
}
Err(e) => println("error: \{e.to_display()}")
}
}
///|
fn pick_input(args : Array[String]) -> String {
if args.length() > 2 && args[1] == "--input" {
args[2]
} else if args.length() > 1 && !args[1].has_prefix("-") {
args[1]
} else {
"; rel=\"next\"; title=\"Page 2\", ; rel=\"canonical\""
}
}
///|
fn relation_list(link : @weblink.WebLink) -> String {
let parts : Array[String] = Array::new()
for rt in link.relations() {
match rt.extension_uri() {
Some(u) => parts.push(u)
None =>
match rt.name() {
Some(n) => parts.push(n)
None => parts.push("?")
}
}
}
let mut out = ""
for i = 0; i < parts.length(); i = i + 1 {
if i > 0 {
out = out + " "
}
out = out + parts[i]
}
out
}