From b066d822597da21ca23dc43615e3e5dc9eb34638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Sat, 14 Mar 2026 13:43:02 -0600 Subject: [PATCH] --- doerg/src/net/deertopia/doerg/element.clj | 60 ++++++++++++----------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/doerg/src/net/deertopia/doerg/element.clj b/doerg/src/net/deertopia/doerg/element.clj index 679471b..968ce77 100644 --- a/doerg/src/net/deertopia/doerg/element.clj +++ b/doerg/src/net/deertopia/doerg/element.clj @@ -16,7 +16,8 @@ [com.rpl.specter.zipper :as sz] [net.deertopia.doerg.common :as common] [net.deertopia.doerg.config :as cfg] - [spec-dict.main :refer [dict]]) + [spec-dict.main :refer [dict]] + [clojure.tools.logging :as l]) (:import (java.util UUID))) @@ -334,6 +335,16 @@ (defmulti object-spec :type) (defmulti recursive-object-spec :type) (defmulti element-spec :type) +(defmulti greater-element-spec :type) + +(defn- unimplemented-spec [x] + (lr/warnf "unimplemented method for %s" (:type x)) + any?) + +(defmethod object-spec :default [x] (unimplemented-spec x)) +(defmethod recursive-object-spec :default [x] (unimplemented-spec x)) +(defmethod greater-element-spec :default [x] (unimplemented-spec x)) +(defmethod element-spec :default [x] (unimplemented-spec x)) (def ^:private nfe "NFE — “no further expectations.” Used in sub-specs of `::element` @@ -342,35 +353,28 @@ (s/with-gen (constantly true) (constantly (gen/return {})))) -(s/def ::object-base - (dict {:type ::object-type})) +(s/def ::object + (s/multi-spec object-spec :type)) -(s/def ::element-base - (dict ^:opt {:contents-begin ::contents-begin - :contents-end ::contents-end} - {:children (s/coll-of ::object :kind vector?) - :type ::element-type})) +(s/def ::element + (s/merge (dict ^:opt {:contents-begin ::contents-begin + :contents-end ::contents-end} + {:children (s/coll-of ::object :kind vector?)}) + (s/multi-spec element-spec :type))) -(s/def ::greater-element-base - (dict {:contents-begin ::contents-begin - :contents-end ::contents-end - :children (s/coll-of ::object :kind vector?) - :type ::greater-element-type})) +(s/def ::greater-element + (s/merge (dict {:contents-begin ::contents-begin + :contents-end ::contents-end + :children (s/coll-of + (s/or :element ::element + :greater-element ::greater-element) + :kind vector?)}) + (s/multi-spec greater-element-spec :type))) (s/def ::recursive-object-base (dict ^:opt {:contents-begin ::contents-begin :contents-end ::contents-end} - {:children (s/coll-of ::object :kind vector?) - #_#_ - :type ::recursive-object-type})) - -(s/def ::object - (s/merge ::object-base - (s/multi-spec object-spec :type))) - -(s/def ::recursive-object - (s/merge ::recursive-object-base - (s/multi-spec recursive-object-spec :type))) + {:children (s/coll-of ::object-base :kind vector?)})) (s/def ::todo-keyword string?) (s/def ::priority string?) @@ -392,8 +396,7 @@ ;;; Specs (specific elements) -#_ -(defmethod node-spec "headline" [_] +(defmethod element-spec "headline" [_] (dict {:todo-keyword (s/nilable ::todo-keyword) :priority (s/nilable ::priority) :level ::level @@ -404,7 +407,6 @@ ;;; Specs (specific greater elements) -#_#_ -(defmethod node-spec "org-data" [_] nfe) +(defmethod greater-element-spec "org-data" [_] nfe) -(defmethod node-spec "section" [_] nfe) +(defmethod greater-element-spec "section" [_] nfe)