lisp/example.lisp @ c6e6e4b4d601

eq
author Steve Losh <steve@stevelosh.com>
date Tue, 26 Mar 2019 22:05:07 -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))))