///|
fn main raise {
  let rule : Json = {
    "if": [
      { "var": "enabled" },
      {
        "map": [
          { "var": "departments" },
          {
            "reduce": [
              { "var": "scores" },
              { "+": [{ "var": "current" }, { "var": "accumulator" }] },
              { "var": "bonus" },
            ],
          },
        ],
      },
      { "var": [{ "cat": ["fallback.", { "var": "selected" }] }] },
    ],
  }
  let report = @rule_analysis.check(rule)
  assert_eq(report.root_paths(), ["enabled", "departments", "selected"])
  assert_eq(report.scopes.length(), 3)
  assert_eq(report.scopes[2].parent_id, Some(1))
  assert_true(report.has_dynamic_paths())
  let dependencies = report.dependencies.map(dependency => {
    let (kind, path) = match dependency.kind {
      @rule_analysis.StaticPath(path) => ("static", path)
      @rule_analysis.WholeScope => ("whole_scope", "")
      @rule_analysis.DynamicPath => ("dynamic", "")
    }
    (
      {
        "scope_id": dependency.scope_id,
        "kind": kind,
        "data_path": path,
        "rule_pointer": dependency.pointer,
      } : Json)
  })
  let result : Json = {
    "valid_syntax": report.is_valid(),
    "root_static_paths": report.root_paths().to_json(),
    "has_dynamic_paths": report.has_dynamic_paths(),
    "scope_count": report.scopes.length(),
    "dependencies": dependencies.to_json(),
  }
  println(result.stringify())
}