2014-09-24 7 views
3

나는 선택적 인수 opts을 복용하는 기능에 대한 전제 조건에 Prismatic schema.core/maybe를 사용하기 위해 노력하고있어,하지만 내가 더 opts와 함수를 호출 할 때 항상 AssertionError를 던질 것 같다Plomatic schema.core/Clojure 함수 전제 조건을 사용할 수 있습니까?

(require '[schema.core :as schema]) 

(defn foo [& modules] 
    {:pre [(schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts)]} 
    :yay) 

(foo :foo) 
;=> :yay 

(foo :foo :bar) 
;=> :yay 

(foo) 
;=> AssertionError Assert failed: (schema/validate (schema/maybe [(schema/enum :foo :bar)]) modules) user/foo (form-init3808809389777994177.clj:1) 

흥미로운 것은이 때문이다를 나는 defnmacroexpand을 사용했습니다

(schema/validate (schema/maybe [(schema/enum :foo :bar)]) nil) 
;=> nil 

,하지만 아무것도 평범한 밖으로 보이는하지 :이 예상대로 작동합니다.

내가

답변

3

함수의 전제 조건은 주장 통과하는 등 truthy 평가하지만, 표현을 schema/validate 반환합니다 같은 전제 조건이 주위의 코스 작업의 수는 유효성 검사를 통과하면, 테스트, 실패하면 예외가 발생되고 . 유효성 검사가 통과되면 항상 true를 반환하도록 전제 조건을 변경해야합니다.

(defn foo [& opts] 
    {:pre [(or (schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts) true)]} 
    :yay) 

(foo :foo) ;=> :yay 
(foo :foo :bar) ;=> :yay 
(foo) ;=> :yay 
(foo :baz) ;=> ExceptionInfo Value does not match schema: [(not (#{:foo :bar} :baz))] 
+0

나는 그것을 놓쳤다 고 생각할 수 없습니다! 이와 같은 경우 스키마에'valid? '함수가 있기를 바랍니다. 내가'(comp nil? schema.core/check) '로 내 자신을 굴릴 수 있다고 생각합니다. –

+0

그것을 생각해 보았지만, 그렇게했다면 Schema의 멋진 오류 메시지를 잃을 것이므로 어쩌면 나는 (또는 (nil? ...)) 접근법을 고수하는 편이 낫다. –

+1

's/check'는'valid? '의 부정이며, 더 유용합니다 - 설명 오류를 반환하거나 유효성 검사가 통과되면 nil을 반환합니다. 그래서 더 나은 전제 조건은'(not (s/check ...))'일 수 있습니다. –