(ns auto-ap.ssr.form-cursor (:require [auto-ap.ssr.utils :refer [path->name2]] [auto-ap.cursor :as cursor])) (def ^:dynamic *form-data*) (def ^:dynamic *form-errors*) (def ^:dynamic *prev-cursor* nil) (def ^:dynamic *current* nil) (defmacro start-form [form-data errors & rest] `(binding [*form-data* ~form-data *form-errors* (or ~errors {})] (binding [*current* (cursor/cursor *form-data*)] ~@rest))) (defmacro with-cursor [cursor & rest] `(binding [*current* ~cursor] ~@rest)) (defmacro with-field [field & rest] `(with-cursor (get *current* ~field ) ~@rest)) (defn field-name ([] (field-name *current*)) ([cursor] (apply path->name2 (cursor/path cursor)))) (defn field-value ([] (field-value *current*)) ([cursor] @cursor)) (defn field-errors ([] (field-errors *current*)) ([cursor] (get-in *form-errors* (cursor/path cursor)))) (defn error? ([] (error? *current*)) ([cursor] (let [errors (get-in *form-errors* (cursor/path cursor))] (and (sequential? errors) (every? string? errors)))))