            (str "\n\n" table)
            nil))))
 
+(defmethod expected-str :problem/missing-key [_type spec-name val path problems opts]
+  (explain-missing-keys problems))
+
 (defmethod problem-group-str :problem/missing-key [_type spec-name val path problems opts]
   (assert (apply = (map :val problems)) (str "All values should be the same, but they are " problems))
   (printer/format

%s"
   (header-label "Spec failed")
   (show-spec-name spec-name (printer/indent (*value-str-fn* spec-name val path (problems/value-in val path))))
   (explain-missing-keys problems)))

(defmethod problem-group-str :problem/not-in-set [_type spec-name val path problems opts]
  (assert (apply = (map :val problems)) (str "All values should be the same, but they are " problems))
  (let [combined-set (apply set/union (map :pred problems))]
    (printer/format
     "%s

%s

should be%s: %s"
     (header-label "Spec failed")
     (show-spec-name spec-name (printer/indent (*value-str-fn* spec-name val path (problems/value-in val path))))
     (if (= 1 (count combined-set)) "" " one of")
     (string/join "," (map #(str "`" % "`") combined-set)))))

(defmethod problem-group-str :problem/missing-spec [_type spec-name val path problems opts]
  (printer/format


%s"
   (header-label "Missing spec")
   (expected-str _type spec-name val path problems opts)))

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