 (defmulti ^:no-doc expected-str (fn [type  spec-name _val _path _problems _opts] type))
 (defmulti ^:no-doc value-str (fn [type  spec-name _val _path _problems _opts] type))
 
+(defn ^:private expected-str* [spec-name problems opts]
+  (let [problem (first problems)
+        {:expound/keys [form in]} problem
+        type (:expound.spec.problem/type problem)]
+    (expected-str type spec-name form in problems opts)))
+
+(defn ^:private value-str* [spec-name problems opts]
+  (let [problem (first problems)
+        {:expound/keys [form in]} problem
+        type (:expound.spec.problem/type problem)]
+    (value-str type spec-name form in problems opts)))
+
+(defn ^:private problem-group-str* [spec-name problems opts]
+  (let [problem (first problems)
+        {:expound/keys [form in]} problem
+        type (:expound.spec.problem/type problem)]
+    (problem-group-str type spec-name form in problems opts)))
+
 (defmethod value-str :default [_type spec-name val path problems opts]
   (show-spec-name spec-name (printer/indent (*value-str-fn* spec-name val path (problems/value-in val path)))))
 

        grouped-subproblems (vals (group-by :expound.spec.problem/type subproblems))]
    (string/join
     "\n\nor\n\n"
     (map #(expected-str2 spec-name % opts) grouped-subproblems))))

;; TODO - namespace to expound
(defmethod value-str :expound.problem/value-group [type spec-name val path problems opts]
  (s/assert ::singleton problems)
  (let [problem (first problems)
        subproblems (:problems problem)
        {:keys [form in type]} (problem-parts (first subproblems) opts)]
    (value-str type spec-name form in subproblems opts)))

(defn ^:private header [type]
  (case type

                opts
                (expected-str type spec-name val path problems opts))))

(defmethod expected-str :expound.problem/alt-group [type spec-name val path problems opts]
  (let [subproblems (:problems (first problems))]
    (string/join
     "\n\nor value\n\n"
     (for [problem subproblems]
       (printer/format
        "%s\n\n%s"
        (value-str* spec-name [problem] opts)
        (expected-str* spec-name [problem] opts))))))

(defmethod problem-group-str :expound.problem/alt-group [_type spec-name val path problems opts]
  (s/assert ::singleton problems)
