///|
fn main {
  let args = @mini.args_get() catch { err => abort("args failed: \{err}") }
  match parse_command(args) {
    Toc(file) => {
      let markdown = @mini.read_text_file(file) catch {
        err => abort("read failed: \{err}")
      }
      write_output(toc_tool(file, markdown))
    }
    Section(file, query) => {
      let markdown = @mini.read_text_file(file) catch {
        err => abort("read failed: \{err}")
      }
      write_output(section_tool(file, markdown, query))
    }
    ParseOutput(output) => write_output(output)
  }
}

///|
fn write_output(output : ToolOutput) -> Unit {
  match output {
    Stdout(text) => write_stdout(text)
    Stderr(text) => write_stderr(text)
  }
}

///|
fn write_stdout(text : String) -> Unit {
  @mini.stdout.write_text(text) catch {
    err => abort("stdout failed: \{err}")
  }
}

///|
fn write_stderr(text : String) -> Unit {
  @mini.stderr.write_text(text) catch {
    err => abort("stderr failed: \{err}")
  }
}