changelog shortlog graph tags branches changeset files file revisions raw help

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

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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
32995daa9a07 skel and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 560
diff changeset
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
32995daa9a07 skel and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 560
diff changeset
29
     (unless (vectorp cmds) (setf cmds (make-cmds cmds)))
32995daa9a07 skel and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 560
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
43
             (cli-lock-p self)
654
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
44
             (length (opts self))
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
45
             (length (cmds self))
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 646
diff changeset
105
         (when (cli-lock-p c)
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 646
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
116
 (defmethod activate-cmd ((self cli-cmd))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
117
   (setf (cli-lock-p self) t))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
124
       (when (and recurse (cmds self))
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
142
 (defmethod active-opts ((self cli-cmd))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
150
       (when (and recurse (cmds self))
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
160
 (defmacro with-opt-restart-case (arg condition)
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
161
   "Bind restarts 'use-as-arg' and 'discard-arg' for duration of BODY."
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
162
   `(restart-case ,condition
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
163
      (use-as-arg () () (make-cli-node 'arg ,arg))
647
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 646
diff changeset
164
      (discard-arg () () (setf ,arg nil))))
645
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
171
    (loop
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
174
      for (a . args) on args
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
175
      if skip
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
180
      else if (short-opt-p a) ;; SHORT OPT
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
183
           (%compose-short-opt o)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
184
           (with-opt-restart-case a
652
328e1ff73938 graph and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 649
diff changeset
185
             (clap-unknown-argument a 'cli-opt)))
649
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
186
      else if (long-opt-p a) ;; LONG OPT
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
187
      collect           
654
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
188
         (let* ((has-eq (long-opt-has-eq-p a))
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
191
           (cond
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
192
             ((and has-eq o)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
193
              (setf (cli-opt-val o) (cdr has-eq))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
194
              (make-cli-node 'opt o))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
195
             ((and (not has-eq) o)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
196
              (prog1
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
197
                  (%compose-long-opt o (pop args))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
198
                (setq skip t)))
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
199
             (t ;; (not o) (not has-eq)
645
3e6a17fb5712 clap upgrades
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
200
              (with-opt-restart-case a
652
328e1ff73938 graph and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 649
diff changeset
201
                (clap-unknown-argument a 'cli-opt)))))
649
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
202
      ;; OPT GROUP
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
212
      else ;; CMD or ARG
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
227
     ;; locked until all subcommands have completed
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
230
           for (node . tail) on (ast ast)
654
Richard Westhaver <ellis@rwest.io>
parents: 653
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
255
   "Push an ARG onto the corresponding slot of a CLI-CMD."
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
260
 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
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
cc13027df6fa ulang and cli updates
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
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
c9aa53ab87eb more sql work
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
272
 (defmethod do-opts ((self cli-cmd))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
246745bf08ad skelcmd fix
Richard Westhaver <ellis@rwest.io>
parents: 485
diff changeset
280
   (if (solop self)
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
281
       (prog1 (call-cmd self (cli-args self) (active-opts self))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
282
         ;; release opts
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
283
         (loop for o across (active-opts self)
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
284
               do (setf (cli-opt-lock o) nil)))
486
246745bf08ad skelcmd fix
Richard Westhaver <ellis@rwest.io>
parents: 485
diff changeset
285
       (loop for c across (active-cmds self)
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
286
             do (do-cmd c)))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
287
   (setf (cli-lock-p self) nil))
649
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 647
diff changeset
288