{
  "filename": "src/shop/storage.clj",
  "rule": "- name: reader-owned-by-with-open\n  where: \"src/shop/storage.clj\"\n  ensure: >-\n    The reader must be owned by with-open so it closes when parsing succeeds or throws. A let binding without cleanup breaks this rule.",
  "corrected": "(ns shop.storage\n  (:require [clojure.java.io :as io]))\n\n(defn read-order-lines [path parse-line]\n  (with-open [reader (io/reader path)]\n    (into [] (map parse-line) (line-seq reader))))\n",
  "broken": "(ns shop.storage\n  (:require [clojure.java.io :as io]))\n\n(defn read-order-lines [path parse-line]\n  (let [reader (io/reader path)]\n    (into [] (map parse-line) (line-seq reader))))\n",
  "regression": [
    "(with-open [reader (io/reader path)]",
    "(let [reader (io/reader path)]"
  ],
  "test_scenarios": [
    [
      "All records valid",
      "Realized vector returned and reader closed"
    ],
    [
      "Parser throws midway",
      "Reader still closed"
    ],
    [
      "Result consumed after function returns",
      "No dependency on a live reader"
    ],
    [
      "Huge input",
      "Separate size/count admission limit rejects it"
    ]
  ],
  "test_source": null,
  "test_command": "clojure -M:test"
}