Add subset type to property resolution

Signed-off-by: Julien Eluard <julien.eluard@gmail.com>
This commit is contained in:
jhe 2018-08-06 13:06:30 +02:00 committed by Julien Eluard
parent f3283d8c11
commit 3d7cd06a4b
No known key found for this signature in database
GPG Key ID: 6FD7DB5437FCBEF6
2 changed files with 19 additions and 9 deletions

View File

@ -1,5 +1,6 @@
(ns pluto.reader.hooks (ns pluto.reader.hooks
(:require [clojure.string :as string] (:require [clojure.string :as string]
[clojure.set :as set]
[pluto.reader.blocks :as blocks] [pluto.reader.blocks :as blocks]
[pluto.reader.errors :as errors] [pluto.reader.errors :as errors]
[pluto.reader.reference :as reference] [pluto.reader.reference :as reference]
@ -9,7 +10,8 @@
(fn [{:keys [type]} _ _ _] (fn [{:keys [type]} _ _ _]
(cond (cond
(keyword? type) type (keyword? type) type
(set? type) :keyword-set (:one-of type) :set
(set? type) :subset
(map? type) :map (map? type) :map
(vector? type) :vector))) (vector? type) :vector)))
@ -58,8 +60,11 @@
(defmethod resolve-property :keyword [def hook _ _] (defmethod resolve-property :keyword [def hook _ _]
(resolve-property-value keyword? def hook)) (resolve-property-value keyword? def hook))
(defmethod resolve-property :keyword-set [def hook _ _] (defmethod resolve-property :set [def hook _ _]
(resolve-property-value (:type def) def hook)) (resolve-property-value (-> def :type :one-of) def hook))
(defmethod resolve-property :subset [def hook _ _]
(resolve-property-value #(set/subset? % (:type def)) def hook))
(declare parse-properties) (declare parse-properties)

View File

@ -64,15 +64,20 @@
{} {}
{'queries/id ""})))) {'queries/id ""}))))
(testing "Set" (testing "Set"
(is (= {:data :one} (hooks/resolve-property {:name :keyword :type #{:one :two :three}} {:keyword :one} {} {}))) (is (= {:data :one} (hooks/resolve-property {:name :keyword :type {:one-of #{:one :two :three}}} {:keyword :one} {} {})))
(is (= {:errors [{::errors/type ::errors/invalid-property-value (is (= {:errors [{::errors/type ::errors/invalid-property-value
::errors/value :for}]} ::errors/value :for}]}
(hooks/resolve-property {:name :keyword :type #{:one :two :three}} {:keyword :for} {} {})))) (hooks/resolve-property {:name :keyword :type {:one-of #{:one :two :three}}} {:keyword :for} {} {}))))
(testing "Subset"
(is (= {:data #{"a" "b"}} (hooks/resolve-property {:name :scope :type #{"a" "b" "c"}} {:scope #{"a" "b"}} {} {})))
(is (= {:errors [{::errors/type ::errors/invalid-property-value
::errors/value #{"a" "d"}}]}
(hooks/resolve-property {:name :scope :type #{"a" "b" "c"}} {:scope #{"a" "d"}} {} {}))))
(testing "Map" (testing "Map"
(is (= {:data :one} (hooks/resolve-property {:name :keyword :type #{:one :two :three}} {:keyword :one} {} {}))) (is (= {:data :one} (hooks/resolve-property {:name :keyword :type {:one-of #{:one :two :three}}} {:keyword :one} {} {})))
(is (= {:errors [{::errors/type ::errors/invalid-property-value (is (= {:errors [{::errors/type ::errors/invalid-property-value
::errors/value :for}]} ::errors/value :for}]}
(hooks/resolve-property {:name :keyword :type #{:one :two :three}} {:keyword :for} {} {}))))) (hooks/resolve-property {:name :keyword :type {:one-of #{:one :two :three}}} {:keyword :for} {} {})))))
(deftest parse (deftest parse
(is (= [:text {} ""] (is (= [:text {} ""]
@ -100,9 +105,9 @@
(hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :child {:name :string :id :keyword}}}}}} (hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :child {:name :string :id :keyword}}}}}}
{'hooks/main.1 {:name "name" :child {:name "name" :id :keyword}}}))) {'hooks/main.1 {:name "name" :child {:name "name" :id :keyword}}})))
(is (= {:data {'hooks/main.1 {:name "name" :child {:name "name" :type :one}}}} (is (= {:data {'hooks/main.1 {:name "name" :child {:name "name" :type :one}}}}
(hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :child {:name :string :type #{:one :two :three}}}}}}} (hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :child {:name :string :type {:one-of #{:one :two :three}}}}}}}}
{'hooks/main.1 {:name "name" :child {:name "name" :type :one}}}))) {'hooks/main.1 {:name "name" :child {:name "name" :type :one}}})))
(is (= {:data {'hooks/main.1 {:name "name" :children [{:name "name" :scopes [{:scope :one}]} {:name "name" :scopes [{:scope :two}]}]}}} (is (= {:data {'hooks/main.1 {:name "name" :children [{:name "name" :scopes [{:scope :one}]} {:name "name" :scopes [{:scope :two}]}]}}}
(hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :children [{:name :string :scopes [{:scope #{:one :two :three}}]}]}}}}} (hooks/parse {:capacities {:hooks {'hooks/main {:properties {:name :string :children [{:name :string :scopes [{:scope {:one-of #{:one :two :three}}}]}]}}}}}
{'hooks/main.1 {:name "name" :children [{:name "name" :scopes [{:scope :one}]} {:name "name" :scopes [{:scope :two}]}]}}))))) {'hooks/main.1 {:name "name" :children [{:name "name" :scopes [{:scope :one}]} {:name "name" :scopes [{:scope :two}]}]}})))))