metosin/malli

Implement `-parse-info` for sequence regexes

Open

#1,230 opened on Oct 16, 2025

 (1 comment) (0 reactions) (0 assignees)Clojure (237 forks)batch import
enhancementhelp wanted

Repository metrics

Stars
 (1,724 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

  • :alt is like :or except any regex child makes it transforming
  • :cat is like :tuple except any regex child makes it transforming
  • leave all others as transforming

Relevant examples:

(let [s [:cat :keyword [:alt [:vector :any] [:+ :int]]]
      v [:k 1 2 3]
      roundtrip #(->> % (m/parse s) (m/unparse s))]
  (list v (roundtrip v)))
;; => ([:k 1 2 3] [:k [1 2 3]])

(def Hiccup ; (leaf node)
  [:cat :keyword [:? [:maybe [:map-of :keyword :any]]] [:* string?]])

(m/parse Hiccup [:div "edge" "case"])
;; => [:div nil ["edge" "case"]]

(let [v [:div "edge" "case"]]
  (= v (->> v (m/parse Hiccup) (m/unparse Hiccup))))
;; => false

(map (m/parser [:cat :int [:? [:maybe :int]] :int])
  [[1 2 3]
   [1 3]
   [1 nil 3]])
;; => ([1 2 3] [1 nil 3] [1 nil 3])

(m/parse [:cat :int [:cat :int]]
  [1 2])
;; => [1 [2]]

(m/parse [:and
          [:orn [:v vector?] [:l list?]]
          [:cat :keyword [:* :any]]]
  [:x])
;; => Execution error (ExceptionInfo) at malli.core/-exception (core.cljc:203).
;;    :malli.core/and-schema-multiple-transforming-parsers

Extracted from: https://clojurians.slack.com/archives/CLDK6MFMK/p1760419966575209

Contributor guide