Schemas are "path-independent", so you have to do this at the level of the map. The easiest way would be to use s/constrained with a predicate, e.g.,
user> (def my-map (s/constrained {Class Object} (fn matching-kvs? [m] (every? #(isa? (type (val %)) (key %)) m)))) #'user/my-map user> (s/validate my-map {Number 1 String "asdf"}) {java.lang.Number 1, java.lang.String "asdf"} user> (s/validate my-map {Number 1 "String" "asdf"}) ExceptionInfo Value does not match schema: {(not (instance? java.lang.Class "String")) invalid-key} schema.core/validator/fn--612 (core.clj:151) user> (s/validate my-map {Number "1" String "asdf"}) ExceptionInfo Value does not match schema: (not (user/matching-kvs?--25671 a-clojure.lang.PersistentArrayMap)) schema.core/validator/fn--612 (core.clj:151) Does that do what you want? On Friday, January 15, 2016 at 7:04:08 PM UTC, JvJ wrote: > > > I've recently started using prismatic schema, and I'm attempting to define > a schema for a map data structure. > > I understand that it is possible to use a schema to define the types of > both keys and values in the map, like so: > > (def my-map {key-schema val-schema}) > > > However, I would like to use the schema to enforce certain relationships > between the keys and values. In particular, this one: > > (fn [[k v]] > (isa? (type v) k)) > > > Is it possible to define an associative map schema that applies a > predicate to key-value pairs rather than just keys and values separately? > > Thanks > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.