More
author |
Steve Losh <steve@stevelosh.com> |
date |
Sat, 13 Apr 2019 10:05:32 -0400 |
parents |
3e8af1c65b8c |
children |
ef75870a1f30 |
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload '(:adopt) :silent t))
(defpackage :example
(:use :cl)
(:export :toplevel :*ui*))
(in-package :example)
;;;; Config -------------------------------------------------------------------
(defparameter *default-name* "World")
;;;; Functionality ------------------------------------------------------------
(defun run (name)
(format t "Hello, ~A~%" name))
;;;; CLI ----------------------------------------------------------------------
(adopt:define-interface *ui*
(:name "example"
:usage "[-n NAME]"
:summary "Say Hello."
:documentation "An example program to show how to make well-behaved CLI tools in Common Lisp."
:examples '(("Say hello:" . "example")
("Say hello to Alice:" . "example --name Alice")))
(help
:documentation "display help and exit"
:long "help"
:short #\h
:reduce (constantly t))
(name
:documentation (format nil "say hello to NAME (default ~A)" *default-name*)
:long "name"
:short #\n
:parameter "NAME"
:initial-value *default-name*
:reduce #'adopt:newest))
(defun toplevel ()
(handler-case
(multiple-value-bind (arguments options) (adopt:parse-options *ui*)
(when (gethash 'help options)
(adopt:print-usage-and-exit *ui*))
(unless (null arguments)
(error "Unrecognized command-line arguments: ~S" arguments))
(run (gethash 'name options)))
(error (c) (adopt:print-error-and-exit c))))