-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdeferring.lisp
83 lines (66 loc) · 3.18 KB
/
deferring.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(in-package #:org.tymoonnext.humbler)
(defmacro set-deferred (class readers &body fill-calls)
(destructuring-bind (class &optional (var class)) (if (listp class) class (list class))
`(progn
,@(loop for reader in readers
collect `(defmethod ,reader :before ((,var ,class))
(unless (slot-boundp ,var ',reader)
(let ((reader ',reader))
(declare (ignorable reader))
,@fill-calls)))))))
(defmacro set-undeferred (class readers)
`(set-deferred ,class ,readers
(error "Slot ~a not set and don't know how to retrieve it." reader)))
(defmacro set-post-deferred (class readers &body fill-calls)
(destructuring-bind (class &optional (var class)) (if (listp class) class (list class))
`(set-deferred (,class ,var) ,readers
(if (slot-boundp ,var 'id)
(progn ,@fill-calls)
;; Default to NIL since we are creating a post.
;; Most likely.
;; I hope.
;;
;; Ho boy.
(setf (slot-value ,var reader) NIL)))))
(set-deferred blog (title url post-count updated description
ask ask-anon ask-page-title like-count share-likes)
(augment blog (blog blog)))
(set-deferred blog (avatar)
(setf (slot-value blog 'avatar)
(blog/avatar (name blog))))
(set-undeferred blog (draft-count queue-count message-count
admin facebook-opengraph-enabled
twitter-send twitter-enabled can-send-fan-mail
followed is-nsfw))
(set-deferred user (following-count default-post-format blogs)
(if (blog= user (*user*))
(augment user (myself))
(error "Slot ~a not set and don't know how to retrieve it." reader)))
(set-post-deferred post (post-type blog-name post-url timestamp date text-format
reblog-key tags bookmarklet mobile source-url
source-title liked state)
(refresh post))
(set-post-deferred text-post (title body)
(refresh text-post))
(set-post-deferred photo-post (photos caption width height)
(refresh photo-post))
(set-post-deferred quote-post (text source)
(refresh quote-post))
(set-post-deferred link-post (title url description)
(refresh link-post))
(set-post-deferred chat-post (title body dialogue)
(refresh chat-post))
(set-post-deferred audio-post (caption player play-count album-art artist album
track-name track-number year)
(refresh audio-post))
(set-post-deferred video-post (caption players)
(refresh video-post))
(set-post-deferred answer-post (asking-name asking-url question answer)
(refresh answer-post))
;; Defaulting to undeferred
(set-post-deferred post (id title body photos caption width height source url
description dialogue player play-count album-art
artist album track-name track-number year players
askin-name asking-url question answer
file post-format tweet slug)
(error "Slot ~a not set and don't know how to retrieve it." reader))