ef3b7ddb |
(in-package :fwoar.rss-reader)
(defgeneric app (obj)
(:documentation "the ningle app that is to be run"))
(defgeneric handler (obj)
(:documentation "the clack handler representing the currently running application"))
(defclass+ rss-reader ()
|
6131cd63 |
((%feeds :initarg :feeds :accessor feeds)
(%app :initform (make-instance 'ningle:<app>)
|
ef3b7ddb |
:reader app)
(%handler :accessor handler))
(:documentation
"A simple wrapper that ties a ningle app to a clack handler"))
|
43b6cc28 |
(defgeneric add-feed (feed reader)
(:method :around (_ reader)
(call-next-method)
reader)
(:method ((feed feed-reference) (reader rss-reader))
(push feed
(feeds reader))))
|
aa626761 |
(defun redirect (target)
(lambda (_)
(declare (ignore _))
`(302 (:location ,target) ())))
|
6131cd63 |
|
ef3b7ddb |
(defmethod araneus:routes progn ((app rss-reader))
(araneus:defroutes (app app)
|
aa626761 |
(("/") (redirect (format nil "/f/~(~a~)"
(feed-key
(car
(feeds app))))))
|
6131cd63 |
(("/f/:feed") (lambda (params)
(optima:match params
((optima.extra:alist (:feed . feed))
|
aa626761 |
(araneus:run-route (feed-page (feeds app)
(find feed (feeds app)
:key 'feed-key
:test 'string-equal))
|
46f06681 |
params)))))
(("/f/:feed/:item") (lambda (params)
(optima:match params
((optima.extra:alist (:feed . feed) (:item . item))
(araneus:run-route (feed-item-page (feeds app)
(find feed (feeds app)
:key 'feed-key
:test 'string-equal)
item)
params)))))))
|
ef3b7ddb |
(defun start (app)
|
cdccff48 |
(prog1 app
(setf (handler app)
(clack:clackup (app app)))))
|
ef3b7ddb |
|
6131cd63 |
(defvar *app*)
(defun unboundp (symbol)
(not (boundp symbol)))
|
ef3b7ddb |
(defun main ()
|
6131cd63 |
(setf *app*
(if (not (boundp '*app*))
(start
(araneus:routes
|
aa626761 |
(rss-reader (list
(feed-reference :techcrunch "https://techcrunch.com/feed/")
(plump-cleaner :coding-horror "http://feeds.feedburner.com/codinghorror")
(feed-reference :daring-fireball "https://daringfireball.net/feeds/main")))))
|
cdccff48 |
(araneus:routes *app*))))
|