// cli_args.mbt — Command-line argument handling for httpsig-tool.
//
// Arguments are `--name value` pairs. Unknown flags are ignored. No external
// input is unwrapped; every lookup is safe.
///|
/// Parses `--name value` pairs from an argument list into a map.
///
/// Repeating a flag (e.g. `--component a --component b`) stores the values
/// under `name0`, `name1`, ... so that ordered lists survive.
fn parse_flags(args : Array[String]) -> Map[String, String] {
let m : Map[String, String] = Map::Map([])
let counts : Map[String, Int] = Map::Map([])
let mut i = 0
while i < args.length() {
let a = args[i]
if a.length() > 2 && a[:2] == "--" {
let name = a[2:].to_owned()
if i + 1 < args.length() {
let count = match counts.get(name) {
Some(c) => c
None => 0
}
let key = if count == 0 { name } else { name + count.to_string() }
m.set(key, args[i + 1])
counts.set(name, count + 1)
i = i + 2
} else {
m.set(name, "")
i = i + 1
}
} else {
i = i + 1
}
}
m
}
///|
/// Looks up a flag value, returning the default when absent.
fn get_flag(m : Map[String, String], name : String, default : String) -> String {
match m.get(name) {
Some(v) => v
None => default
}
}
///|
/// Looks up an optional flag value.
fn get_flag_opt(m : Map[String, String], name : String) -> String? {
m.get(name)
}
///|
/// Parses an Int64 flag, returning `None` on invalid input.
fn get_flag_i64(m : Map[String, String], name : String) -> Int64? {
match m.get(name) {
Some(v) => @hsig.parse_int64_cli(v)
None => None
}
}
///|
/// Returns the argument list excluding the program name.
fn arg_tail(args : Array[String]) -> Array[String] {
let out : Array[String] = Array::new()
for i = 1; i < args.length(); i = i + 1 {
out.push(args[i])
}
out
}