changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/clap/cmd.lisp

changeset 485: c9aa53ab87eb
parent: 3e721a3349a0
child: 246745bf08ad
author: Richard Westhaver <ellis@rwest.io>
date: Sun, 30 Jun 2024 00:20:25 -0400
permissions: -rw-r--r--
description: more sql work
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
1
 ;;; cli/clap/cmd.lisp --- Clap Commands
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
2
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
3
 ;; Command Objects used to build CLI Applications.
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
4
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
5
 ;;; Code:
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
6
 (in-package :cli/clap/obj)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
7
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
8
 (defclass cli-cmd ()
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
9
   ;; name slot is required and must be a string
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
10
   ((name :initarg :name :initform (required-argument :name) :accessor cli-name :type string)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
11
    (opts :initarg :opts :initform (make-array 0 :element-type 'cli-opt :adjustable t)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
12
          :accessor cli-opts :type (vector cli-opt))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
13
    (cmds :initarg :cmds :initform (make-array 0 :element-type 'cli-cmd :adjustable t)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
14
          :accessor cli-cmds :type (vector cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
15
    (thunk :initform #'default-thunk :initarg :thunk :accessor cli-thunk :type function-lambda-expression)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
16
    (lock :initform nil :initarg :lock :accessor cli-lock-p :type boolean)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
17
    (description :initarg :description :accessor cli-description :type string)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
18
    (args :initform nil :initarg :args :accessor cli-cmd-args))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
19
   (:documentation "CLI command class inherited by both the 'main' command which is executed when
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
20
 a CLI is called without arguments, and all subcommands."))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
21
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
22
 (defmethod initialize-instance :after ((self cli-cmd) &key)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
23
   (with-slots (name cmds opts thunk) self
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
24
     (unless (stringp name) (setf name (format nil "~(~A~)" name)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
25
     (unless (vectorp cmds) (setf cmds (funcall (compile nil `(lambda () ,cmds)))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
26
     (unless (vectorp opts) (setf opts (funcall (compile nil `(lambda () ,opts)))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
27
     (when (symbolp thunk) (setf thunk (symbol-function thunk)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
28
     self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
29
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
30
 (defmethod print-object ((self cli-cmd) stream)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
31
   (print-unreadable-object (self stream :type t)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
32
     (format stream "~A :opts ~A :cmds ~A :args ~A"
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
33
             (cli-name self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
34
             (length (cli-opts self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
35
             (length (cli-cmds self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
36
             (length (cli-cmd-args self)))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
37
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
38
 (defmethod print-usage ((self cli-cmd) &optional stream)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
39
   (with-slots (opts cmds) self
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
40
     (format stream "~(~A~) ~A~A~A"
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
41
             (cli-name self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
42
             (if-let ((d (and (slot-boundp self 'description) (cli-description self))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
43
               (format nil ": ~A" d)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
44
               "")
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
45
             (if (null opts)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
46
                 ""
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
47
                 (format nil "~{~%    ~A~^~}" (loop for o across opts collect (print-usage o nil))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
48
             (if (null cmds)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
49
                 ""
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
50
                 (format nil "~{!~A~}" (loop for c across cmds collect (print-usage c nil)))))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
51
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
52
 (defmethod push-cmd ((self cli-cmd) (place cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
53
   (vector-push self (cli-cmds place)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
54
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
55
 (defmethod push-opt ((self cli-opt) (place cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
56
   (vector-push self (cli-opts place)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
57
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
58
 (defmethod pop-cmd ((self cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
59
   (vector-pop (cli-cmds self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
60
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
61
 (defmethod pop-opt ((self cli-opt))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
62
   (vector-pop (cli-opts self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
63
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
64
 (defmethod cli-equal ((a cli-cmd) (b cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
65
   (with-slots (name opts cmds) a
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
66
     (with-slots ((bn name) (bo opts) (bc cmds)) b
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
67
       (and (string= name bn)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
68
            (if (and (null opts) (null bo))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
69
                t
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
70
                (unless (member nil (loop for oa across opts
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
71
                                          for ob across bo
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
72
                                          collect (cli-equal oa ob)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
73
                  t))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
74
            (if (and (null cmds) (null bc))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
75
                t
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
76
                (unless (member nil (loop for ca across cmds
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
77
                                          for cb across bc
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
78
                                          collect (cli-equal ca cb)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
79
                  t))))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
80
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
81
 (defmethod find-cmd ((self cli-cmd) name &optional active)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
82
   (when-let ((c (find name (cli-cmds self) :key #'cli-name :test #'string=)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
83
     (if active 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
84
         ;; maybe issue warning here? report to user
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
85
         (if (cli-lock-p c)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
86
             c
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
87
             (clap-error c))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
88
         c)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
89
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
90
 (defmethod active-cmds ((self cli-cmd))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
91
   (remove-if-not #'cli-lock-p (cli-cmds self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
92
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
93
 (defmethod find-opts ((self cli-cmd) name &key active recurse)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
94
   (let ((ret))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
95
     (flet ((%find (o obj)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
96
              (when-let ((found (find o (cli-opts obj) :key #'cli-opt-name :test 'equal)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
97
                (push found ret))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
98
       (when (and recurse (cli-cmds self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
99
         (loop for c across (cli-cmds self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
100
               do (%find name c)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
101
       (%find name self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
102
       (when active
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
103
         (setf ret (remove-if-not #'cli-lock-p ret)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
104
       ret)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
105
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
106
 (defmethod active-opts ((self cli-cmd) &optional global)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
107
   (remove-if-not 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
108
    (if global 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
109
        #'active-global-opt-p
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
110
        #'cli-opt-lock)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
111
    (cli-opts self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
112
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
113
 (defmethod find-short-opts ((self cli-cmd) ch &key recurse)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
114
   (let ((ret))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
115
     (flet ((%find (ch obj)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
116
              (when-let ((found (find ch (cli-opts obj) :key #'cli-opt-name :test #'opt-string-prefix-eq)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
117
                (push found ret))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
118
       (when (and recurse (cli-cmds self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
119
         (loop for c across (cli-cmds self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
120
               do (%find ch c)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
121
       (%find ch self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
122
       ret)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
123
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
124
 (declaim (inline solop))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
125
 (defun solop (self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
126
   (and (= 0 (length (active-cmds self)) (length (active-opts self)))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
127
 
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
128
 (defmethod proc-args ((self cli-cmd) args)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
129
   "Process ARGS into an ast. Each element of the ast is a node with a
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
130
 :kind slot, indicating the type of node and a :form slot which stores
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
131
 a value.
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
132
 
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
133
 For now we parse group separators '--' and insert a nil into the tree,
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
134
 this will likely change to generating a new branch in the ast as it
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
135
 should be."
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
136
   (make-cli-ast
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
137
    (let ((holes)) ;; list of arg indexes which can be skipped since they're
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
138
      ;; consumed by an opt
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
139
      (loop 
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
140
        for i below (length args)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
141
        for (a . args) on args
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
142
        if (member i holes)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
143
        do (continue) ;; skip args which have been consumed already
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
144
        else if (= (length a) 1)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
145
        collect (make-cli-node 'arg a) ; always treat single-char as arg
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
146
        else if (short-opt-p a) ;; SHORT OPT
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
147
        collect (if-let ((o (find-short-opts self (aref a 1) :recurse t)))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
148
                  (%compose-short-opt (car o) a)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
149
                  (make-cli-node 'arg a))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
150
        else if (long-opt-p a) ;; LONG OPT
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
151
        collect (if-let ((o (find-opts self (string-left-trim "-" a) :recurse t)))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
152
                  (prog1 (%compose-long-opt (car o) args)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
153
                    (push (1+ i) holes))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
154
                  (make-cli-node 'arg a))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
155
        ;; OPT GROUP
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
156
        else if (opt-group-p a)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
157
        collect nil
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
158
        ;; CMD
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
159
        else
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
160
        collect (let ((cmd (find-cmd self a)))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
161
                  (if cmd
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
162
                      ;; TBD
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
163
                      (make-cli-node 'cmd (find-cmd self a))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
164
                      ;; ARG
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
165
                      (make-cli-node 'arg a)))))))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
166
 
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
167
 (defmethod install-ast ((self cli-cmd) (ast cli-ast))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
168
   "Install the given AST, recursively filling in value slots."
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
169
   (with-slots (cmds opts) self
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
170
     ;; we assume all nodes in the ast have been validated and the ast
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
171
     ;; itself is consumed. validation is performed in proc-args.
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
172
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
173
     ;; before doing anything else we lock SELF, which should remain
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
174
     ;; locked for the full runtime duration.
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
175
     (setf (cli-lock-p self) t)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
176
     (loop named install
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
177
           for (node . tail) on (debug! (cli-ast ast))
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
178
           until (null node)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
179
           do 
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
180
              (let ((kind (cli-node-kind node)) (form (cli-node-form node)))
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
181
                (case kind
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
182
                  ;; opts 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
183
                  (opt
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
184
                   (let ((name (cli-opt-name form)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
185
                     (when-let ((o (car (find-opts self name))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
186
                       (setf o form)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
187
                       (setf (cli-opt-lock o) t))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
188
                  ;; when we encounter a command we recurse over the tail
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
189
                  (cmd 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
190
                   (when-let ((c (find-cmd self (cli-name form))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
191
                     ;; handle the rest of the AST
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
192
                     (setf c (install-ast c (make-cli-ast tail)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
193
                     (return-from install)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
194
                  (arg (push-arg form self)))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
195
     (setf (cli-cmd-args self) (nreverse (cli-cmd-args self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
196
     self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
197
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
198
 (defmethod install-thunk ((self cli-cmd) (lambda function) &optional compile)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
199
   "Install THUNK into the corresponding slot in cli-cmd SELF."
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
200
   (let ((%thunk (if compile (compile nil lambda) lambda)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
201
     (setf (cli-thunk self) %thunk)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
202
     self))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
203
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
204
 (defmethod push-arg (arg (self cli-cmd))
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
205
   "Push an ARG onto the corresponding slot of a CLI-CMD."
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
206
   (push arg (cli-cmd-args self)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
207
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
208
 (defmethod parse-args ((self cli-cmd) args &key (compile t))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
209
   "Parse ARGS and return the updated object SELF.
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
210
 ARGS is assumed to be a valid cli-ast (list of cli-nodes), unless COMPILE is
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
211
 t, in which case a list of strings is assumed."
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
212
   (with-slots (opts cmds) self
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
213
     (let ((args (if compile (proc-args self args) args)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
214
       (install-ast self args))))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
215
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
216
 ;; warning: make sure to fill in the opt and cmd slots with values
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
217
 ;; from the top-level args before calling a command.
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
218
 (defmethod call-cmd ((self cli-cmd) args opts)
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
219
   (trace! "calling command:" args opts)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
220
   (funcall (cli-thunk self) args opts))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
221
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
222
 (defmethod do-cmd ((self cli-cmd))
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
223
   "Perform the command, recursively calling child commands and opts if necessary."
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
224
   (unless (solop self)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
225
         (loop for o across (active-opts self)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
226
               do (do-opt o))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
227
         (loop for c across (active-cmds self)
485
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
228
               do (do-cmd c)))
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
229
   (call-cmd self (cli-cmd-args self) (active-opts self)))