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/opt.lisp --- Clap 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
|
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 | ;; CLI Opt Objects |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
4 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
5 | ;;; Code: |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
6 | (in-package :cli/clap/obj) |
419
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
7 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
8 | ;;; Parsers |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
9 | (make-opt-parser string *arg*) |
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
|
10 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
11 | (make-opt-parser boolean (when *arg* t)) |
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
|
12 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
13 | (make-opt-parser (form string) (read-from-string *arg*)) |
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
|
14 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
15 | (make-opt-parser (list form) (when (listp *arg*) *arg*)) |
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
|
16 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
17 | (make-opt-parser (symbol form) (when (symbolp *arg*) *arg*)) |
479 | 18 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
19 | (make-opt-parser (keyword form) (when (keywordp *arg*) *arg*)) |
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 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
21 | (make-opt-parser number (when *arg* (parse-number *arg*))) |
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
|
22 | |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
23 | (make-opt-parser integer (when *arg* (parse-integer *arg*))) |
479 | 24 | |
25 | (make-opt-parser (file string) |
|
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
26 | (parse-native-namestring *arg* nil *default-pathname-defaults* :as-directory nil)) |
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
|
27 | |
479 | 28 | (make-opt-parser (directory string) |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
29 | (sb-ext:parse-native-namestring *arg* nil *default-pathname-defaults* :as-directory t)) |
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
|
30 | |
479 | 31 | (make-opt-parser (pathname string) |
580
571685ae64f1
queries, cli fixes, dat/csv, emacs org-columns
Richard Westhaver <ellis@rwest.io>
parents:
563
diff
changeset
|
32 | (pathname *arg*)) |
479 | 33 | |
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
|
34 | ;;; Objects |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
35 | (defstruct cli-opt |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
36 | ;; note that cli-opts can have a nil or unbound name slot |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
37 | (name "" :type string) |
643
f901de70a80e
opt fixes and test updates
Richard Westhaver <ellis@rwest.io>
parents:
625
diff
changeset
|
38 | (kind 'boolean :type (or symbol list)) |
683
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
39 | (thunk 'identity :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
|
40 | (val 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
|
41 | (description nil :type (or null 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
|
42 | (lock nil :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
|
43 | |
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
|
44 | (defmethod cli-name ((self cli-opt)) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
45 | (cli-opt-name self)) |
65102f74d1ae
some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents:
654
diff
changeset
|
46 | |
649 | 47 | (defmethod activate-opt ((self cli-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
|
48 | (setf (cli-opt-lock self) t)) |
649 | 49 | |
688 | 50 | (defmethod cli-lock-p ((self cli-opt)) |
51 | (cli-opt-lock self)) |
|
52 | ||
649 | 53 | (defun %compose-short-opt (o) |
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
54 | (setf (cli-opt-val o) t) |
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
55 | (make-cli-node 'opt o)) |
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
56 | |
649 | 57 | (defun %compose-long-opt (o &optional val) |
58 | (setf (cli-opt-val o) val) |
|
426
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
59 | (make-cli-node 'opt o)) |
3e721a3349a0
completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents:
419
diff
changeset
|
60 | |
653
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
649
diff
changeset
|
61 | (defun %compose-keyword-opt (o val) |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
649
diff
changeset
|
62 | (setf (cli-opt-val o) val) |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
649
diff
changeset
|
63 | (make-cli-node 'opt o)) |
119532882cb1
added keyword-opts (experimental)
Richard Westhaver <ellis@rwest.io>
parents:
649
diff
changeset
|
64 | |
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
|
65 | (defmethod handle-unknown-argument ((self cli-opt) arg)) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
66 | (defmethod handle-missing-argument ((self cli-opt) arg)) |
0f0e5f9b5c55
add emacs/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 | (defmethod handle-invalid-argument ((self cli-opt) arg)) |
0f0e5f9b5c55
add emacs/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 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
69 | (defmethod initialize-instance :after ((self cli-opt) &key) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
70 | (with-slots (name thunk) self |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
71 | (unless (stringp name) (setf name (format nil "~(~A~)" name))) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
72 | 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
|
73 | |
683
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
74 | (defmethod make-load-form ((obj cli-opt) &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
|
75 | (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
|
76 | obj |
688 | 77 | :slot-names '(name kind thunk val description lock) |
683
c5fe76568de0
fixed clap objects to support make-load-form method - thunk is symbol only
Richard Westhaver <ellis@rwest.io>
parents:
655
diff
changeset
|
78 | :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
|
79 | |
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
|
80 | (defmethod install-thunk ((self cli-opt) (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
|
81 | "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
|
82 | (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
|
83 | (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
|
84 | 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
|
85 | |
0f0e5f9b5c55
add emacs/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 | (defmethod print-object ((self cli-opt) 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
|
87 | (print-unreadable-object (self stream :type t) |
688 | 88 | (format stream "~A :active ~A :val ~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
|
89 | (cli-opt-name self) |
688 | 90 | (cli-opt-lock 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
|
91 | (cli-opt-val self)))) |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
92 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
93 | (defmethod print-usage ((self cli-opt) &optional stream) |
688 | 94 | (format stream "-~(~{~A~^/--~}~) ~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
|
95 | (let ((n (cli-opt-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
|
96 | (declare (simple-string n)) |
0f0e5f9b5c55
add emacs/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 | (list (make-shorty n) n)) |
0f0e5f9b5c55
add emacs/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 | (if-let ((d (and (slot-boundp self 'description) (cli-opt-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
|
99 | (format stream ": ~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
|
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 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
102 | (defmethod cli-equal ((a cli-opt) (b cli-opt)) |
688 | 103 | (with-slots (name kind) a |
104 | (with-slots ((bn name) (bk kind)) b |
|
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
|
105 | (and (equal 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
|
106 | (equal kind bk))))) |
0f0e5f9b5c55
add emacs/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 | |
0f0e5f9b5c55
add emacs/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 | (defmethod call-opt ((self cli-opt) arg) |
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 | (funcall (cli-opt-thunk self) arg)) |
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
|
110 | |
0f0e5f9b5c55
add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents:
404
diff
changeset
|
111 | (defmethod do-opt ((self cli-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
|
112 | (setf (cli-opt-val self) (call-opt self (cli-opt-val 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
|
113 | |
688 | 114 | (defmethod do-opts ((self vector)) |
625 | 115 | (loop for opt across self |
688 | 116 | do (do-opt opt))) |