             message (str/format message data)]
         (throw (ex-info message {}))))))
 
+(defn extract
+  [schema data]
+  (let [keycoll (keys schema)]
+    (select-keys data keycoll)))
+
+(defn extract!
+  "Extract and validate."
+  [schema data]
+  (validate! schema data)
+  (extract schema data))

  (:refer-clojure :exclude [keyword uuid vector boolean])
  (:require [bouncer.core :as b]
            [bouncer.validators :as v]
            [cuerdas.core :as str]
            [uxbox.shapes :refer (shape?)]))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Validators

(def number v/number)
(def integer v/integer)
(def boolean v/boolean)
(def string v/string)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Public Api
