///|
fn main {
  let test_output = "Total tests: 3, passed: 3, failed: 0."
  let check_output = "Finished. moon: ran 2 tasks, now up to date"
  let bundle = @evidence.EvidenceBundle::new("quickstart", "moon 0.1.20260703")
  let bundle = match
    @evidence.test_run_entry(
      "tests",
      "run tests",
      test_output,
      command="moon test --target wasm-gc",
    ) {
    Some(entry) => bundle.add(entry)
    None => bundle
  }
  let bundle = match
    @evidence.check_run_entry(
      "check",
      "run moon check",
      check_output,
      command="moon check --target wasm-gc --deny-warn",
    ) {
    Some(entry) => bundle.add(entry)
    None => bundle
  }
  println(bundle.as_json().stringify(indent=2))
  println("digest: " + bundle.digest())
  println("validation: " + bundle_validation_text(@evidence.validate(bundle)))
  let policy = @evidence.ReleasePolicy::new(["tests", "check"], [])
  println("policy: " + policy_text(@evidence.evaluate_policy(bundle, policy)))
  match @evidence.release_gate(bundle) {
    @evidence.ReadyToShip => println("release gate: ready")
    @evidence.Blocked(blockers) =>
      println("release gate: blocked by " + blockers.length().to_string())
  }
}

///|
fn bundle_validation_text(result : @evidence.BundleValidation) -> String {
  match result {
    @evidence.Valid => "valid"
    @evidence.Invalid(issues) =>
      "invalid (" + issues.length().to_string() + " issues)"
  }
}

///|
fn policy_text(result : @evidence.PolicyDecision) -> String {
  match result {
    @evidence.Allowed => "allowed"
    @evidence.Blocked(reasons) =>
      "blocked: " + reasons.length().to_string() + " reasons"
  }
}