Skip to content

:merge with registries does not round-trip #1088

@frenchy64

Description

@frenchy64

If schemas with registries are merged with :merge, the dereferenced schema often cannot be round-tripped.

Notice the following schema is missing a ::z binding so is no longer well-formed.

(-> (m/deref
      [:merge
       [:map {:registry {::y int?}}
        [:y ::y]]
       [:map {:registry {::z boolean?}}
        [:z ::z]]]
      options)
    m/form)
=>
[:map {:registry {::y boolean?}}
 [:y ::y]
 [:z ::z]]

We might be able to fix this by merging the registries, but something else is needed if the registries both define the same names.

For example, here the schema for :y is being captured by the wrong scope, and becomes [:y boolean?] instead of [:y int?].

(-> (m/deref
      [:merge
       [:map {:registry {::y int?}}
        [:y ::y]]
       [:map {:registry {::y boolean?}}
        [:z ::y]]]
      options)
    m/form)
=>
[:map {:registry {::y boolean?}}
 [:y ::y]
 [:z ::y]]

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Status

    👍 Could do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions