changeset 698: | 96958d3eb5b0 |
parent: | 517c65b51e6b |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
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 | |
560
b9c64be96888
make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents:
486
diff
changeset
|
5 | ;;; Commentary: |
b9c64be96888
make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents:
486
diff
changeset
|
6 | |
b9c64be96888
make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents:
486
diff
changeset
|
7 | ;; |
b9c64be96888
make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents:
486
diff
changeset
|
8 | |
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
|
9 | ;;; Code: |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
10 | (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
|
11 | |
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 | (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
|
13 | ;; 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
|
14 | ((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
|
15 | (opts :initarg :opts :initform (make-array 0 :element-type 'cli-opt :adjustable t) |
654 | 16 | :accessor opts :type (vector cli-opt)) |
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
|
17 | (cmds :initarg :cmds :initform (make-array 0 :element-type 'cli-cmd :adjustable t) |
654 | 18 | :accessor cmds :type (vector cli-cmd)) |
683
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
19 | (thunk :initform 'default-thunk :initarg :thunk :accessor cli-thunk :type symbol) |
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
|
20 | (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
|
21 | (description :initarg :description :accessor cli-description :type string) |
688 | 22 | (args :initform nil :initarg :args :accessor cli-args)) |
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
|
23 | (: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
|
24 | 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
|
25 | |
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 | (defmethod initialize-instance :after ((self cli-cmd) &key) |
567 | 27 | (with-slots (name thunk opts cmds) 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
|
28 | (unless (stringp name) (setf name (format nil "~(~A~)" name))) |
567 | 29 | (unless (vectorp cmds) (setf cmds (make-cmds cmds))) |
30 | (unless (vectorp opts) (setf opts (make-opts 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
|
31 | 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
|
32 | |
683
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
33 | (defmethod make-load-form ((obj cli-cmd) &optional env) |
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
34 | (make-load-form-saving-slots |
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
35 | obj |
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
36 | :slot-names '(name opts cmds thunk lock description args) |
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
37 | :environment env)) |
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
38 | |
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
|
39 | (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
|
40 | (print-unreadable-object (self stream :type t) |
688 | 41 | (format stream "~A :active ~a :opts ~A :cmds ~A :args ~A" |
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
|
42 | (cli-name self) |
688 | 43 | (cli-lock-p self) |
654 | 44 | (length (opts self)) |
45 | (length (cmds self)) |
|
688 | 46 | (length (cli-args 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
|
47 | |
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 | (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
|
49 | (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
|
50 | (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
|
51 | (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
|
52 | (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
|
53 | (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
|
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 | (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
|
56 | "" |
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 | (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
|
58 | (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
|
59 | "" |
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 | (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
|
61 | |
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 | (defmethod push-cmd ((self cli-cmd) (place cli-cmd)) |
654 | 63 | (vector-push self (cmds place))) |
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
|
64 | |
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 | (defmethod push-opt ((self cli-opt) (place cli-cmd)) |
654 | 66 | (vector-push self (opts place))) |
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
|
67 | |
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 | (defmethod pop-cmd ((self cli-cmd)) |
654 | 69 | (vector-pop (cmds 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
|
70 | |
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 | (defmethod pop-opt ((self cli-opt)) |
654 | 72 | (vector-pop (opts 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
|
73 | |
646
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
74 | (defmethod handle-unknown-opt ((self cli-cmd) (opt string)) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
75 | (with-opt-restart-case opt |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
76 | (clap-unknown-argument opt 'cli-opt))) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
77 | |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
78 | (defmethod handle-invalid-opt ((self cli-cmd) (opt string) &optional reason) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
79 | (clap-invalid-argument opt :kind 'cli-opt :reason reason)) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
80 | |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
81 | (defmethod handle-missing-opt ((self cli-cmd) (opt string)) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
82 | (clap-missing-argument opt 'cli-opt)) |
95fd920af398
error handling methods for clap
Richard Westhaver <ellis@rwest.io>
parents:
645
diff
changeset
|
83 | |
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
|
84 | (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
|
85 | (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
|
86 | (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
|
87 | (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
|
88 | (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
|
89 | 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
|
90 | (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
|
91 | 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
|
92 | 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
|
93 | 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
|
94 | (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
|
95 | 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
|
96 | (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
|
97 | 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
|
98 | 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
|
99 | 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
|
100 | |
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 | (defmethod find-cmd ((self cli-cmd) name &optional active) |
654 | 102 | (when-let ((c (find name (cmds self) :key #'cli-name :test #'string=))) |
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
|
103 | (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
|
104 | ;; maybe issue warning here? report to user |
647 | 105 | (when (cli-lock-p c) |
106 | c) |
|
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
|
107 | 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
|
108 | |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
109 | (defmethod (setf find-cmd) ((new cli-cmd) (self cli-cmd) name &optional active) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
110 | (let ((match (find-cmd self name active) )) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
111 | (substitute new match (cmds self) :test 'cli-equal))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
112 | |
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
|
113 | (defmethod active-cmds ((self cli-cmd)) |
654 | 114 | (remove-if-not #'cli-lock-p (cmds 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
|
115 | |
649 | 116 | (defmethod activate-cmd ((self cli-cmd)) |
117 | (setf (cli-lock-p self) t)) |
|
118 | ||
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
|
119 | (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
|
120 | (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
|
121 | (flet ((%find (o obj) |
654 | 122 | (when-let ((found (find o (opts obj) :key #'cli-opt-name :test 'equal))) |
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
|
123 | (push found ret)))) |
654 | 124 | (when (and recurse (cmds self)) |
125 | (loop for c across (cmds 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
|
126 | 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
|
127 | (%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
|
128 | (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
|
129 | (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
|
130 | 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
|
131 | |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
132 | (defmethod find-opt ((self cli-cmd) name &optional active) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
133 | (let ((ret (find name (opts self) :key #'cli-opt-name :test 'equal))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
134 | (if active |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
135 | (when (cli-opt-lock ret) ret) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
136 | ret))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
137 | |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
138 | (defmethod (setf find-opt) ((new cli-opt) (self cli-cmd) name &optional active) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
139 | (let ((match (find-opt self name active))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
140 | (substitute new match (opts self) :test 'cli-equal))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
141 | |
688 | 142 | (defmethod active-opts ((self cli-cmd)) |
143 | (remove-if-not 'cli-opt-lock (opts 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
|
144 | |
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
|
145 | (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
|
146 | (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
|
147 | (flet ((%find (ch obj) |
654 | 148 | (when-let ((found (find ch (opts obj) :key #'cli-opt-name :test #'opt-string-prefix-eq))) |
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
|
149 | (push found ret)))) |
654 | 150 | (when (and recurse (cmds self)) |
151 | (loop for c across (cmds 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
|
152 | 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
|
153 | (%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
|
154 | 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
|
155 | |
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
|
156 | (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
|
157 | (defun solop (self) |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
158 | (= 0 (length (active-cmds self)) (length (active-opts 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
|
159 | |
645 | 160 | (defmacro with-opt-restart-case (arg condition) |
161 | "Bind restarts 'use-as-arg' and 'discard-arg' for duration of BODY." |
|
162 | `(restart-case ,condition |
|
163 | (use-as-arg () () (make-cli-node 'arg ,arg)) |
|
647 | 164 | (discard-arg () () (setf ,arg nil)))) |
645 | 165 | |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
166 | (defmethod proc-args ((self cli-cmd) args) |
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
167 | "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
|
168 | :kind slot, indicating the type of node and a :form slot which stores |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
169 | an object." |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
170 | (make-cli-ast |
649 | 171 | (loop |
172 | with skip |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
173 | with exit |
649 | 174 | for (a . args) on args |
175 | if skip |
|
176 | do (setq skip nil) |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
177 | else if exit |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
178 | do (return) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
179 | ;; TODO 2024-09-15: handle flag groups -abcd |
649 | 180 | else if (short-opt-p a) ;; SHORT OPT |
181 | collect |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
182 | (if-let ((o (car (find-short-opts self (aref a 1) :recurse nil)))) |
649 | 183 | (%compose-short-opt o) |
184 | (with-opt-restart-case a |
|
652 | 185 | (clap-unknown-argument a 'cli-opt))) |
649 | 186 | else if (long-opt-p a) ;; LONG OPT |
187 | collect |
|
654 | 188 | (let* ((has-eq (long-opt-has-eq-p a)) |
189 | (name (or (car has-eq) (string-left-trim "-" a))) |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
190 | (o (car (find-opts self name :recurse nil)))) |
649 | 191 | (cond |
192 | ((and has-eq o) |
|
193 | (setf (cli-opt-val o) (cdr has-eq)) |
|
194 | (make-cli-node 'opt o)) |
|
195 | ((and (not has-eq) o) |
|
196 | (prog1 |
|
197 | (%compose-long-opt o (pop args)) |
|
198 | (setq skip t))) |
|
199 | (t ;; (not o) (not has-eq) |
|
645 | 200 | (with-opt-restart-case a |
652 | 201 | (clap-unknown-argument a 'cli-opt))))) |
649 | 202 | ;; OPT GROUP |
203 | else if (opt-group-p a) |
|
653
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
204 | collect |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
205 | (make-cli-node 'group nil) |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
206 | ;; OPT KEYWORD (experimental) |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
207 | else if (opt-keyword-p a) |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
208 | collect (if-let ((o (car (find-opts self (string-left-trim ":" a) :recurse nil)))) |
653
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
209 | (prog1 (%compose-keyword-opt o (pop args)) |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
210 | (setq exit t)) |
653
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
652
diff
changeset
|
211 | (make-cli-node 'arg a)) |
649 | 212 | else ;; CMD or ARG |
213 | collect |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
214 | (if-let ((cmd (find-cmd self a))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
215 | (prog1 (make-cli-node 'cmd (parse-args cmd args :compile t)) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
216 | (setq exit t)) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
217 | ;; just a plain arg - move to next |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
218 | (make-cli-node 'arg a))))) |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
219 | |
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 | (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
|
221 | "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
|
222 | (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
|
223 | ;; 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
|
224 | ;; 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
|
225 | |
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 | ;; before doing anything else we lock SELF, which should remain |
649 | 227 | ;; locked until all subcommands have completed |
228 | (activate-cmd 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
|
229 | (loop named install |
649 | 230 | for (node . tail) on (ast ast) |
654 | 231 | while 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
|
232 | do |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
233 | (let ((kind (cli-node-kind node)) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
234 | (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
|
235 | (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
|
236 | ;; 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
|
237 | (opt |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
238 | (setf #1=(find-opt self (cli-name form)) form) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
239 | (activate-opt #1#) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
240 | (log:trace! (format nil "installing opt ~A" (cli-name form)))) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
241 | (cmd |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
242 | (setf (find-cmd self (cli-name form)) form) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
243 | (log:trace! (format nil "installing cmd ~A" (cli-name form)))) |
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
|
244 | (arg (push-arg form self))))) |
688 | 245 | (setf (cli-args self) (nreverse (cli-args 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
|
246 | 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
|
247 | |
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
|
248 | (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
|
249 | "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
|
250 | (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
|
251 | (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
|
252 | 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
|
253 | |
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
|
254 | (defmethod push-arg (arg (self cli-cmd)) |
485 | 255 | "Push an ARG onto the corresponding slot of a CLI-CMD." |
688 | 256 | (push arg (cli-args 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
|
257 | |
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
|
258 | (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
|
259 | "Parse ARGS and return the updated object SELF. |
485 | 260 | ARGS is assumed to be a valid cli-ast (list of cli-nodes), unless COMPILE is |
261 | 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
|
262 | (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
|
263 | (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
|
264 | (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
|
265 | |
626 | 266 | ;; WARNING: make sure to fill in the opt and cmd slots with values |
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
|
267 | ;; 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
|
268 | (defmethod call-cmd ((self cli-cmd) args opts) |
485 | 269 | (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
|
270 | (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
|
271 | |
688 | 272 | (defmethod do-opts ((self cli-cmd)) |
273 | (do-opts (active-opts self))) |
|
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
274 | |
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
|
275 | (defmethod do-cmd ((self cli-cmd)) |
655
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
276 | "Perform the active command or subcommand, recursively calling DO-CMD on |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
277 | subcommands until a level is reached which satisfies SOLOP. active OPTS are |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
278 | evaluated with DO-OPTS along the way." |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
279 | (do-opts self) |
486 | 280 | (if (solop self) |
688 | 281 | (prog1 (call-cmd self (cli-args self) (active-opts self)) |
282 | ;; release opts |
|
283 | (loop for o across (active-opts self) |
|
284 | do (setf (cli-opt-lock o) nil))) |
|
486 | 285 | (loop for c across (active-cmds self) |
688 | 286 | do (do-cmd c))) |
287 | (setf (cli-lock-p self) nil)) |
|
649 | 288 |