Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compose spec #51

Open
arichiardi opened this issue Oct 24, 2017 · 3 comments
Open

Compose spec #51

arichiardi opened this issue Oct 24, 2017 · 3 comments

Comments

@arichiardi
Copy link
Collaborator

arichiardi commented Oct 24, 2017

One of the great features of clojure.spec is the ability of merging specs, because they are essentially data (ok macros are still in the way, but nothing is perfect).

At the moment js.spec does not do that, but it would be great if we could do something like:

const aSpec = S.spec.map("a spec", {
  a: S.spec.object,
  b: S.spec.object,
});

const composedSpec = S.merge(aSpec , {
  c: S.spec.object
}

Ok the example does not make too much sense, but we should be composing and reusing specs.

...I have had a look at the code and this is actually a big shift because of the use of class...still think is worth doing it...maybe the S.merge function can just merge the fields...

@mattbishop
Copy link
Contributor

So you're saying neither Spec.or nor Spec.and will work. Can you provide a link to the Clojure Spec docs section that shows how to do this?

@arichiardi
Copy link
Collaborator Author

arichiardi commented Nov 3, 2017

It is more on the composition of each individual spec, where one just adds fields on top of the other.

In Clojure spec there is a merge:

(s/def :animal/kind string?)
(s/def :animal/says string?)
(s/def :animal/common (s/keys :req [:animal/kind :animal/says]))
(s/def :dog/tail? boolean?)
(s/def :dog/breed string?)

(s/def :animal/dog (s/merge :animal/common (s/keys :req [:dog/tail? :dog/breed])))

(s/valid? :animal/dog
  {:animal/kind "dog"
   :animal/says "woof"
   :dog/tail? true
   :dog/breed "retriever"})

@mattbishop
Copy link
Contributor

Does this only apply to map specs?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants