#!@GUILE@ \ --no-auto-compile -e main -s !# (use-modules (simple-zmq) (config) (config api) (config parser sexp) (config licenses) (json)) (define config (configuration (name 'rh-client) (synopsis "client for reading-heap") (keywords (list (setting (name 'service-socket) (synopsis "socket for communication with the service") (default (string-append "ipc://" (or (getenv "XDG_RUNTIME_DIR") "/tmp") "/reading-heap.sock"))) (switch (name 'write) (synopsis "write the default config") (default #f) (test boolean?) (character #f)) (switch (name 'title) (synopsis "title of the new media") (default "") (test string?) (character #t)) (switch (name 'author) (synopsis "author of the new media") (default "") (test string?) (character #t)) (switch (name 'location) (synopsis "location of the new media") (default "") (test string?) (character #t)) (switch (name 'priority) (synopsis "priority of the new media") (default "1") (test string?) (character #t)))) (subcommands (list (configuration (name 'next) (synopsis "get the next media to consume") (wanted '((keywords . (service-socket))))) (configuration (name 'new) (synopsis "add new media to the heap") (wanted '((keywords . (service-socket title author location priority))))) (configuration (name 'consume) (synopsis "remove the next media from the heap") (wanted '((keywords . (service-socket))))) (configuration (name 'shutdown) (synopsis "shutdown the heap") (wanted '((keywords . (service-socket))))))) (directory (list (in-home ".reading-heap/") (path (given (string-append (or (getenv "XDG_CONFIG_HOME") (string-append (getenv "HOME") "/.config")) "/reading-heap/")) (eager? #t)))) (parser sexp-parser) (copyright @COPYRIGHT@) (version @HVERSION@) (license @LICENSE@) (author @AUTHOR@))) (define context (zmq-create-context)) (define client-socket (zmq-create-socket context ZMQ_REQ)) (define (client-setup sock) (zmq-connect client-socket sock)) (define (rh-client-next) (zmq-send client-socket "next") (let ((msg (zmq-receive-bytevector client-socket 1500))) (display (bv->string msg)))) (define (rh-client-new json) (zmq-send client-socket "new") (zmq-receive client-socket 1500) (zmq-send client-socket json) (display (zmq-receive client-socket 1500)) (zmq-send client-socket "next") (display (zmq-receive client-socket 1500))) (define (rh-client-consumed) (zmq-send client-socket "consume") (display (zmq-receive client-socket 1500))) (define (rh-client-shutdown) (zmq-send client-socket "shutdown") (display (zmq-receive client-socket 1500))) (define (json-from-args priority title author location) (scm->json-string `(("priority" . ,priority) ("title" . ,title) ("author" . ,author) ("location" . ,location)))) (define (main cmd-line) (let ((options (getopt-config-auto cmd-line config))) (when (option-ref options 'write) (options-write options)) (cond ((string=? (cadr (full-command options)) "next") (client-setup (option-ref options 'service-socket)) (rh-client-next)) ((string=? (cadr (full-command options)) "new") (client-setup (option-ref options 'service-socket)) (rh-client-new (json-from-args (string->number (option-ref options 'priority)) (option-ref options 'title) (option-ref options 'author) (option-ref options 'location)))) ((string=? (cadr (full-command options)) "consume") (client-setup (option-ref options 'service-socket)) (rh-client-consumed)) ((string=? (cadr (full-command options)) "shutdown") (client-setup (option-ref options 'service-socket)) (rh-client-shutdown)) (#t (emit-help options)))))