--- a/brows.asd Mon Apr 13 21:23:33 2020 -0400
+++ b/brows.asd Mon Apr 13 21:29:44 2020 -0400
@@ -8,6 +8,7 @@
:depends-on (
+ :adopt
:boots
:cl-ppcre
:external-program
--- a/src/build.lisp Mon Apr 13 21:23:33 2020 -0400
+++ b/src/build.lisp Mon Apr 13 21:29:44 2020 -0400
@@ -1,4 +1,7 @@
-(ql:quickload :brows)
+(ql:quickload :brows :silent t)
+
+(with-open-file (stream "bin/brows.1" :direction :output :if-exists :supersede)
+ (adopt:print-manual brows::*ui* :stream stream))
#+sbcl
(progn
--- a/src/main.lisp Mon Apr 13 21:23:33 2020 -0400
+++ b/src/main.lisp Mon Apr 13 21:29:44 2020 -0400
@@ -108,17 +108,42 @@
((#\j :down) (incf-pos 1))
(t nil)))))
-(defmacro catch-and-spew-errors (&body body)
- `(handler-case (progn ,@body)
- (t (c) (format t "Error: ~A" c))))
+(defun run ()
+ (catch 'done
+ (with-open-file (input "/dev/tty" :direction :input)
+ (with-open-file (output "/dev/tty" :direction :output :if-exists :append)
+ (boots/terminals/ansi:with-ansi-terminal (terminal :input-stream input :output-stream output)
+ (boots:with-screen (screen terminal :root (boots:make-canvas :draw #'draw))
+ (init)
+ (main)))))))
+
+
+;;;; CLI ----------------------------------------------------------------------
+(adopt:define-string *documentation*
+ "Brows is a utility for finding links in a chunk of text and presenting a ~
+ nice text-based UI for opening them. It's written (and customizable) in ~
+ Common Lisp.")
+
+(defparameter *ui*
+ (adopt:make-interface
+ :name "brows"
+ :usage "[OPTIONS]"
+ :summary "Find links and present a menu for opening them in a browser."
+ :help *documentation*
+ :examples '(("Present a menu for opening some links:" .
+ "curl http://stevelosh.com/ | brows"))
+ :contents (list (adopt:make-option 'help
+ :help "Display help and exit."
+ :long "help"
+ :short #\h
+ :reduce (constantly t)))))
(defun toplevel ()
- (catch-and-spew-errors
- (catch 'done
- (with-open-file (input "/dev/tty" :direction :input)
- (with-open-file (output "/dev/tty" :direction :output :if-exists :append)
- (boots/terminals/ansi:with-ansi-terminal (terminal :input-stream input :output-stream output)
- (boots:with-screen (screen terminal :root (boots:make-canvas :draw #'draw))
- (init)
- (main))))))))
-
+ (handler-case
+ (multiple-value-bind (arguments options) (adopt:parse-options *ui*)
+ (when (gethash 'help options)
+ (adopt:print-help-and-exit *ui*))
+ (when arguments
+ (error "Unrecognized command line arguments: ~S" arguments))
+ (run))
+ (error (c) (adopt:print-error-and-exit c))))