2017-10-11 2 views
0

Si vous avez un ensemble de spécifications utilisées pour valider un ensemble hiérarchique de données - par exemple un fichier yaml. D'après l'une des spécifications de l'enfant, est-il possible de référencer les données qui se produisent plus tôt dans l'arbre?Clojure Spec accédant aux données dans les spécifications hiérarchiques

+0

Avez-vous un exemple précis? D'une manière générale, vos spécifications internes/imbriquées ne vont pas recevoir de données ancestrales, mais il est possible que vous puissiez résoudre le problème avec la spécification externe. –

+0

Je veux valider un yaml qui représente une structure de données complexe. Le point de validation que je veux prouver est celui où une partie de la structure fait référence à une autre partie de la même structure, mais je veux prouver que la partie référencée existe réellement. Cela signifie que vous êtes sur le point d'appliquer un prédicat au point de référence et de reculer l'arborescence yaml, puis de redescendre au point de l'élément référencé. Pour ce faire, je dois pouvoir obtenir le parent de la spécification qui valide la référence. – mmer

+0

On dirait que vous voulez que nous écrivions du code pour vous. Bien que de nombreux utilisateurs soient prêts à produire du code pour un codeur en détresse, ils ne font généralement que contribuer lorsque l'affiche a déjà tenté de résoudre le problème par eux-mêmes. Une bonne façon de démontrer cet effort est d'inclure le code que vous avez écrit jusqu'ici, l'exemple d'entrée (s'il y en a), la sortie attendue, et la sortie que vous obtenez réellement (sortie console, retraçages, etc.). Plus vous fournissez de détails, plus vous aurez de chances de recevoir des réponses. Vérifiez la [FAQ] et [demander]. –

Répondre

0

Voici un exemple d'une approche que vous pourriez prendre:

(s/def ::tag string?) 

(s/def ::inner (s/keys :req-un [::tag])) 

(s/def ::outer 
    (s/and 
    (s/keys :req-un [::inner ::tag]) 
    #(= (:tag %) ;; this tag must equal inner tag 
     (:tag (:inner %))))) 

(s/conform ::outer {:tag "y" ;; inner doesn't match outer 
        :inner {:tag "x"}}) 
;=> :clojure.spec.alpha/invalid 

(s/conform ::outer {:tag "x" 
        :inner {:tag "x"}}) 
;=> {:tag "x", :inner {:tag "x"}} 

Selon vos besoins, vous pourriez être en mesure de faire vos affirmations comme celui-ci, de l'extérieur dans l'intérieur plutôt que de départ.

+0

Merci une réponse vraiment utile – mmer