git.fiddlerwoaroof.com
Browse code

refactor(renderer): adjust order of arguments for RENDER-FEED

Ensures that the renderer takes priority over the other arguments.

Edward Langley authored on 23/10/2022 22:52:18
Showing 2 changed files
... ...
@@ -45,12 +45,12 @@
45 45
    (source-type :initarg :source-type :initform nil :accessor source-type)))
46 46
 
47 47
 (defmethod render ((feed feed) renderer)
48
-  (let ((doc (alimenta.render:render-feed feed renderer)))
48
+  (let ((doc (alimenta.render:render-feed renderer feed)))
49 49
     (for:for ((item over feed))
50 50
       (setf doc
51
-            (alimenta.render:add-rendered-item doc
52
-                                               (alimenta.render:render-item item feed renderer)
53
-                                               renderer)))
51
+            (alimenta.render:add-rendered-item renderer
52
+                                               doc
53
+                                               (alimenta.render:render-item renderer item feed))))
54 54
     doc))
55 55
 
56 56
 (defmethod (setf feed-link) ((value string) (feed feed))
... ...
@@ -1,12 +1,46 @@
1 1
 (in-package :alimenta.render)
2 2
 
3
-(defgeneric render-feed (feed renderer)
3
+(defgeneric render-feed (renderer feed)
4 4
   (:documentation "Render the container for the feed's items. Return an object
5 5
                    to which the items can be added via add-rendered-item"))
6 6
 
7
-(defgeneric render-item (item feed renderer)
7
+(defgeneric render-item (renderer item feed)
8 8
   (:documentation "Render an item to be added to a feed. Return an object that
9 9
                    can be added to the container by add-rendered-item"))
10 10
 
11
-(defgeneric add-rendered-item (feed-representation item-representation renderer)
11
+(defgeneric add-rendered-item (renderer feed-representation item-representation)
12 12
   (:documentation "Add the rendered item to the rendered feed"))
13
+
14
+(defmethod alimenta.render:render-feed ((renderer (eql :hash-table)) (feed alimenta:feed))
15
+  (alexandria:plist-hash-table
16
+   (list "title" (alimenta:title feed)
17
+         "link" (alimenta:link feed)
18
+         "description" (alimenta:description feed)
19
+         "url" (puri:render-uri (alimenta:feed-link feed) nil)
20
+         "source-type" (string (alimenta:source-type feed)))
21
+   :test 'equal))
22
+
23
+(defmethod alimenta.render:render-item ((renderer (eql :hash-table))
24
+                                        (item alimenta:item)
25
+                                        (feed alimenta:feed))
26
+  (alexandria:plist-hash-table
27
+   (list "title" (alimenta:title item)
28
+         "link" (alimenta:link item)
29
+         "author" (alimenta:author item)
30
+         "date" (local-time:format-rfc3339-timestring nil (alimenta:date item))
31
+         "id" (alimenta:id item)
32
+         "description" (alimenta:description item)
33
+         "content" (alimenta:content item))
34
+   :test 'equal))
35
+
36
+(defmethod alimenta.render:add-rendered-item ((renderer (eql :hash-table))
37
+                                              (feed-representation hash-table)
38
+                                              (item hash-table))
39
+  (prog1 feed-representation
40
+    (setf (gethash "items"
41
+                   feed-representation
42
+                   nil)
43
+          (append (gethash "items"
44
+                           feed-representation
45
+                           nil)
46
+                  (list item)))))