///|
fn main {
  let args = @env.args()
  let payload = first_payload(args).unwrap_or(
    "(01)09501101530003(10)BATCH-7(17)260930",
  )
  try {
    let parsed = @barcoder.parse_gs1(payload)
    println(parsed.to_hri())
    if has_flag(args, "--validate") {
      println(parsed.validate().summary())
    }
    if has_flag(args, "--encode") || has_flag(args, "--ascii") {
      match @barcoder.encode_gs1_128(parsed) {
        Ok(encoded) => {
          println(
            "symbols=\{encoded.symbol_count}; modules=\{encoded.module_count}",
          )
          if has_flag(args, "--ascii") {
            println(@barcoder.render_code128_ascii(encoded, quiet_zone=10))
          }
        }
        Err(_) => println("Code 128 encoding failed")
      }
    }
    if has_flag(args, "--benchmark") {
      let report = @barcoder.benchmark_parse(payload, iterations=1000)
      println(report.summary())
    }
  } catch {
    _ => println("invalid GS1 payload")
  }
}

///|
fn first_payload(args : Array[String]) -> String? {
  for index, arg in args {
    if index > 0 && !arg.has_prefix("--") {
      return Some(arg)
    }
  }
  None
}

///|
fn has_flag(args : Array[String], flag : String) -> Bool {
  for arg in args {
    if arg == flag {
      return true
    }
  } nobreak {
    false
  }
}