changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/clap/opt.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/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
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
24
 
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
49
 
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
50
 (defmethod cli-lock-p ((self cli-opt))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
51
   (cli-opt-lock self))
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
52
 
649
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
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
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
57
 (defun %compose-long-opt (o &optional val)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
103
   (with-slots (name kind) a
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
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
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
114
 (defmethod do-opts ((self vector))
625
e49442cd6010 cli tweaks
Richard Westhaver <ellis@rwest.io>
parents: 580
diff changeset
115
   (loop for opt across self
688
517c65b51e6b clap tests
Richard Westhaver <ellis@rwest.io>
parents: 683
diff changeset
116
         do (do-opt opt)))