;;; Guile Feed --- Feed command-line interface. ;;; Copyright © 2018 Oleg Pykhalov ;;; ;;; This file is part of Guile Feed. ;;; ;;; Guile Feed is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published ;;; by the Free Software Foundation; either version 3 of the License, ;;; or (at your option) any later version. ;;; ;;; Guile Feed is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Guile Feed. If not, see ;;; . (define-module (feed scripts rss) #:use-module (guix scripts) #:use-module (guix ui) #:use-module (ice-9 match) #:use-module (ice-9 pretty-print) #:use-module (feed rss) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:use-module (srfi srfi-37) #:export (feed-rss)) ;;; ;;; Command-line options. ;;; (define %default-options ;; Alist of default option values. '()) (define %options (list (option '(#\h "help") #f #f (lambda args (show-help) (exit 0))) (option '(#\o "output-file") #t #f (lambda (opt name arg result) (alist-cons 'output-file arg result))) (option '(#\s "search") #t #f (lambda (opt name arg result) (alist-cons 'search arg result))) (option '("show") #t #t (lambda (opt name arg result) (alist-cons 'show arg result))))) (define (show-help) (display "Usage: guix rss -o FILE\n") (newline) (display " -h, --help display this help and exit") (display " -V, --version display version information and exit") (display " -o, --output-file=FILE convert rss to LISP FILE") (display " -s, --search=REGEXP search in name and description using REGEXP") (display " --show=RSS show details about RSS") (newline)) ;;; ;;; Entry point. ;;; (define (feed-rss . args) (define (parse-options) ;; Return the alist of option values. (parse-command-line args %options (list %default-options) #:build-options? #f)) (let* ((opts (parse-options)) (output (assoc-ref opts 'output-file)) (search (assoc-ref opts 'search)) (show (assoc-ref opts 'show))) (cond (show (leave-on-EPIPE (for-each (cute feed->recutils <>) (find-feeds-by-name show)))) (search (let* ((patterns (filter-map (match-lambda (('search . rx) rx) (_ #f)) opts)) (regexps (map (cut make-regexp* <> regexp/icase) patterns))) (leave-on-EPIPE (let-values (((rss scores) (find-feeds-by-description regexps))) (for-each (lambda (rss score) (feed->recutils rss #:extra-fields `((relevance . ,score)))) rss scores))) #t)) (output (with-output-to-file output (lambda _ (pretty-print (feeds->lisp))))))))