git.fiddlerwoaroof.com
main.lisp
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*))))