Yeah, I read your expound code, really nice btw.

I'm currently trying something very similar to expound but with a GUI 
approach to explore errors.

I think encoding map paths as [key pos-in-map-entry] should work in all 
cases as is currently doing in s/map-of. I can't see any issues if s/keys 
explains in the same way, which it currently doesn't because it just 
reports [key].

Juan

El jueves, 13 de julio de 2017, 11:27:44 (UTC-3), Ben Brinckerhoff escribió:
>
> No, you're not missing anything. I've run into the same issue. I see 
> you've found the related JIRA issue, but for those who haven't it's 
> https://dev.clojure.org/jira/browse/CLJ-2192
>
> > So the thing is that if you see a problem in [::k 1] you don't know if 
> its the ::k value, or the value is a sequence and the problem is its 
> element at pos 1.
>
> Yes, you're correct, this is ambiguous right now. In Expound (
> https://github.com/bhb/expound) I have some code that tries to determine 
> which case it is, based upon some heuristics, but I'm sure there are cases 
> in which I'll get it wrong.
>
> There are two other interesting related cases I've run into related to the 
> `:in` path.
>
> First, there is the case where the key is wrong, not the value:
>
>   (s/def ::spec-1 (s/map-of keyword? int?))
>
>   (-> (s/explain-data ::spec-1 {"foobar" 5})
>       :clojure.spec.alpha/problems
>       first
>       :in)
>   ;; ["foobar" 0]
>
> This is also ambiguous in the way you've noted above, but it's not clear 
> how to construct this path - how do we "point to" a key of a map?
>
> Second, there is the case where we want to use 'coll-of' with a map. In 
> this case, the `in` path is just [0]
>
>   (s/def ::coll-of (s/coll-of int? :kind map?))
>   (-> (s/explain-data ::coll-of {"foobar" 5})
>       :clojure.spec.alpha/problems
>       first
>       :in)
>   ;; [0]
>
> AFAICT, we don't know from looking at that path whether it means: "look up 
> the key `0` in the map" (incorrect) or "convert the map to a sequence, then 
> get the 0th element" (correct). Again, Expound has some heuristics to try 
> to figure this out.
>
> Right now, this logic is buried in the (messy) internals of Expound, but I 
> will soon be providing a cleaner set of functions that allows clients to do 
> more with the :clojure.spec.alpha/problems, including one that will provide 
> a `in` path that works around these issues (in most common cases).
>
> Ben
>
> On Wednesday, July 12, 2017 at 8:50:19 AM UTC-6, Juan Monetta wrote:
>>
>> Hi everyone,
>>
>> I started exploring the clojure.spec "better user errors" thing and I'm 
>> having some trouble matching clojure.spec.alpha/problems inside
>> :clojure.spec.alpha/value in explain-data.
>>
>> I'm trying to understand if there is currently a way of using problem to 
>> directly find the part of the value that is causing the issue independent of
>> the spec that failed.
>>
>> For example given a spec :
>>
>> (s/def ::spec-1 (s/map-of keyword? int?))
>>
>> (-> (s/explain-data ::spec-1 {::k 8.8})
>>                          :clojure.spec.alpha/problems
>>                          first
>>                          :in)
>> => [::k 1]   ;; which means the problem was with the value, not the key
>>
>> but given a different spec for the same data :
>>
>> (s/def ::k int?)
>> (s/def ::spec-2 (s/keys :req [::k]))
>>
>> (-> (s/explain-data ::spec-2 {::k 8.8})
>>                          :clojure.spec.alpha/problems
>>                          first
>>                          :in)
>> => [::k]
>>
>> So the thing is that if you see a problem in [::k 1] you don't know if 
>> its the ::k value, or the value is a sequence and 
>> the problem is its element at pos 1.
>>
>> Does it make sense or I'm missing something?
>>
>> I'm trying with [org.clojure/clojure "1.9.0-alpha17"]
>>
>>

-- 
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.

Reply via email to