is there a way to have different map layouts, I wanted to do something like this
[:map [:coord [:or
[:map {:closed true}]
[:map {:closed true} [:x int? :y int?]]]]]
{:coord {}}
{:coord {:x 1 :y 1}}
I know I can make the whole map optional but what about allowing an empty map or a map with fixed keys, I tried a few things but could not find a way.@oliver.marks I think this works if you use for the second :map
:
[:map {:closed true} [:x int?] [:y int?]]
yeah that works for the second map, just not sure how to make it work also for an empty map I tried putting optional in various places and tried :or and a few other things oh I might have missed some brackets above but its more an an illustration of one of the methods I tried
[:map {:closed true :optional true} [:x int?] [:y int?]]
also tried this but that does not work, I know I could make the :x and :y keys optional but really I want an all or nothing methodI tried it with your :or
above and that worked (after adding the missing brackets)
this passes ? {:coord {}} when I run it through m/valid i get missing keys or I was yesterday when I was testing π
nice, I will re check what I have maybe there was a different error which I did not spot
[:map [:coord [:or
[:map {:closed true}]
[:map {:closed true}
[:x {:optional false} int?]
[:y {:optional false} int?]]]]]
what about that, I think because the key do not have the optional map the :or is irrelevant anyway
although perhaps thats it, perhaps its optional thats messing me up looking at your screenshot again I can see it fails when one of the keys are missing
@alpox thanks for your rubber ducking, not an issue with malli I had 2 schmeas with similar name and was updating the wrong one π
Oups π np
I constantly get the feeling that I'm missing a schema to talk about map schemas in terms of key-value pairs
an annoying example to implement is mutual exclusion, such as a map which can have x, y and (z or u)
where z and u have different value types, too
@ikitommi I've created https://github.com/metosin/malli/issues/472 with a test case which demonstrates the issue.
@richard.hundt I profiled you example, it looks like CPU mostly goes towards parsing the schema. If you wrap every def-ed schema with a schema constructor it seems to be way more efficient, would you mind trying?
D'you mean just wrapping it in a function which returns the structure? (I'm not sure what you mean by "schema constructor")
like so;
(def A1
(m/schema
[:map
{:encode/test {:leave encode} :decode/test decode}
[:type [:= "A1"]]
[:value float?]
]))
thanks, I'll try
m/schema
parses the children once
your implementation has no way to cache these results
It's a bother to do from scratch, you can take this
thanks slack, very helpful
thank you
https://gist.github.com/bsless/28a20f7e8f21f01fd93a788cf65444d4
there, more convenient
yeah, that's pretty much instant now, I'll try it on our production code
π
Perfect. Thanks Ben! What shall I do with the github issue? Do I close it, or are you planning on making changes to parsing?
Hear hear. I think something like malli-keys-relations
should be there. With qualified keywords, itβs less boilerplate (but, still has):
[:or
[:map ::x ::y ::z]
[:map ::x ::y ::u]]
spec-style would be:
[:map ::x ::y [:keys/or ::y ::u]]
maybe:
[:and
[:map ::x ::y ::z ::u]
[:keys/or ::z ::u]]
β¦ and the mandatory JSON Schema way for this: https://json-schema.org/understanding-json-schema/reference/conditionals.html
I closed the issue, no plans on making the parser faster or caching at the moment. Thanks for @ben.sless for digging into this π
I think it is worth to leave a comment on the issue and perhaps a note in the readme regarding references to uncompiled schemas
And you're welcome π
Turns out I was completely wrong regarding the transformers and satisfies?
I see you left a comment with a link to the gist, so that would leave only the readme
JSON Schema's BNF was one of the motivations for it
> map which contains at least one ::x
where ::x
is [:or [:x int?] [:y float?]]
If we had it we could define JSON Schema with malli (translating the ebnf is straightforward), then define encoders and decoders to transform between the two
if you have idea what and where to write this, please do π
1πadded a video of the new function instrumention. three apis: advanced, normal users and for the lazy: https://github.com/metosin/malli/pull/471
4πcomments welcome