 (s/def :youtube.video/like-count nat-int?)
 (s/def :youtube.video/dislike-count nat-int?)
 (s/def :youtube.video/comment-count nat-int?)
+
+(s/def :gmail.filter/id string?)
+(s/def :gmail.filter.criteria/from string?)
+(s/def :gmail.filter.action/add-label-ids string?)
+(s/def :gmail.filter.action/remove-label-ids string?)
+
+(defn map->flatten-ns [ns m]
+  (reduce
+    (fn [m [k v]]
+      (let [k (-> k name gstr/toSelectorCase)]
+        (if (map? v)
+          (merge m (map->flatten-ns (str ns "." k) v))
+          (assoc m (keyword ns k) v))))
+    {}
+    m))
 
 (defn get-auth-token [options]
   (let [c (async/promise-chan)]

  (js/console.log @video-id->message-id)

  (go
    (-> (request-token) <! js/console.log))
  (go
    (-> (youtube-queue-ids {}) <!

            [goog.crypt.base64 :as gb]
            [clojure.string :as str]
            [pathom.core :as p]
            [cljs.spec :as s]
            [goog.string :as gstr])
  (:import goog.Uri
           goog.Uri.QueryData))

