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

I look forward to seeing what you come up with!

Ben

On Thursday, July 13, 2017 at 8:48:45 AM UTC-6, Juan Monetta wrote:
>
> 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