///|
fn usage() -> Unit {
  println(
    "moonlink 0.2.0\n\nUsage:\n  moonlink resolve [--json] ...\n  moonlink version\n  moonlink help\n\nThe resolve command links symbol names across ELF64 relocatable objects and prints a deterministic link map.",
  )
}

///|
fn read_input(path : String) -> @lib.LinkInput {
  let bytes = @fs.read_file_to_bytes(path) catch {
    error => {
      eprintln("moonlink: cannot read '\{path}': \{@debug.to_string(error)}")
      abort("")
    }
  }
  @lib.parse_object(path, bytes) catch {
    error => {
      eprintln("moonlink: '\{path}': \{error.message()}")
      abort("")
    }
  }
}

///|
fn resolve(paths : Array[String], json_output : Bool) -> Unit {
  let inputs : Array[@lib.LinkInput] = []
  for path in paths {
    inputs.push(read_input(path))
  }
  let report = @lib.resolve_objects(inputs)
  if json_output {
    println(report.to_json())
  } else {
    println(report.to_link_map())
    println(report.summary())
  }
  if !report.is_ok() {
    abort("")
  }
}

///|
fn main {
  let raw = @env.args()
  let args : Array[String] = if raw.length() <= 1 {
    []
  } else {
    raw[1:].to_owned()
  }
  if args.is_empty() {
    usage()
    return
  }
  match args[0] {
    "help" | "--help" | "-h" => usage()
    "version" | "--version" | "-V" => println("moonlink 0.2.0")
    "resolve" => {
      let paths : Array[String] = []
      let mut json_output = false
      for index in 1.. {
      eprintln("moonlink: unknown command '\{command}'")
      usage()
      abort("")
    }
  }
}