///|
fn demo() -> Unit {
  let template = "Hello {{name}}! Welcome to {{project}}."
  let data : Json = {
    "name": "developer",
    "project": "Stencil Template Engine",
  }
  try {
    let result = @lib.render(template, data)
    println(result)
  } catch {
    @lib.TemplateError(msg) => println("Error: \{msg}")
  }
}

///|
fn benchmark() -> Unit raise @lib.TemplateError {
  let workload = @lib.production_benchmark_workload()
  let result = @lib.run_benchmark(workload)
  println("benchmark=stencil")
  println("workload=" + result.workload)
  println("iterations=" + result.iterations.to_string())
  println("output_length=" + result.output_length.to_string())
  println("checksum=" + result.checksum.to_string())
  println(@lib.benchmark_summary(result))
  println("consistent=" + @lib.benchmark_is_consistent(result).to_string())
}

///|
fn wants_benchmark(args : Array[String]) -> Bool {
  let mut i = 0
  while i < args.length() {
    if args[i] == "benchmark" {
      return true
    }
    i = i + 1
  }
  false
}

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

///|
fn analyze_demo() -> Unit {
  let source = "\n

{{title}}

\n{{#items}}{{>card}}{{/items}}" try { let stats = @lib.analyze(source) println("analysis=" + stats.summary()) println("complexity_score=" + stats.complexity_score().to_string()) } catch { @lib.TemplateError(message) => println("Analysis error: \{message}") } } ///| fn compatibility_demo() -> Unit { let results = @lib.run_compatibility_suite(@lib.compatibility_cases()) println("compatibility=" + @lib.compatibility_summary(results)) for failure in @lib.compatibility_failures(results) { println( "failure=" + failure.name + ": expected=" + failure.expected + ", actual=" + failure.actual, ) } } ///| fn main { let args = @env.args() if wants_benchmark(args) { benchmark() catch { @lib.TemplateError(msg) => println("Benchmark error: \{msg}") } } else if wants_command(args, "analyze") { analyze_demo() } else if wants_command(args, "compatibility") { compatibility_demo() } else { demo() } }