branch: elpa/hyperdrive
commit 2f5ff56f5a6c46465bb1e2cea15a51b6270c924f
Author: Jonas Bernoulli <jo...@bernoul.li>
Commit: Jonas Bernoulli <jo...@bernoul.li>

    Change: (hyperdrive-menu--entry) New convenience function
    
    This doesn't have to be a macro as suggested in the todo item, which
    this addresses.
    
    However, the order matters in which we try `transient--prefix'
    and `transient-current-prefix', and use the first that is non-nil.
    `transient-current-prefix' may be another prefix from which we invoke
    the current prefix, so `transient--prefix' has to take precedence.
---
 hyperdrive-menu.el | 89 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 46 insertions(+), 43 deletions(-)

diff --git a/hyperdrive-menu.el b/hyperdrive-menu.el
index 3ef4c3b551..760c2293e5 100644
--- a/hyperdrive-menu.el
+++ b/hyperdrive-menu.el
@@ -53,8 +53,6 @@
 ;;                     hyperdrive-current-entry))
 ;;          ,@body))))
 
-;; TODO: Add macro that expands `entry' into (oref transient--prefix scope)
-;; or (oref transient-current-prefix scope) as appropriate.
 ;;;###autoload (autoload 'hyperdrive-menu "hyperdrive-menu" nil t)
 (transient-define-prefix hyperdrive-menu (entry)
   "Show the hyperdrive transient menu."
@@ -62,7 +60,7 @@
   [["Hyperdrive"
     :description
     (lambda ()
-      (if-let* ((entry (oref transient--prefix scope))
+      (if-let* ((entry (hyperdrive-menu--entry))
                 (hyperdrive (hyperdrive-entry-hyperdrive entry)))
           (concat (propertize "Hyperdrive: " 'face 'transient-heading)
                   (hyperdrive--format-host hyperdrive :with-label t))
@@ -72,11 +70,11 @@
     ("L" "Open Link" hyperdrive-open-url)]
    ["Version"
     :if (lambda ()
-          (and (oref transient--prefix scope)
+          (and (hyperdrive-menu--entry)
                ;; TODO: Remove this check and add useful history transient UI.
                (not (eq 'hyperdrive-history-mode major-mode))))
     :description (lambda ()
-                   (if-let ((entry (oref transient--prefix scope)))
+                   (if-let ((entry (hyperdrive-menu--entry)))
                        (concat (propertize "Version: "
                                            'face 'transient-heading)
                                (propertize (format "%s"
@@ -86,10 +84,10 @@
                      "Version"))
     ("V p" "Previous" hyperdrive-open-previous-version
      :inapt-if-not (lambda ()
-                     (hyperdrive-entry-previous (oref transient--prefix scope) 
:cache-only t))
+                     (hyperdrive-entry-previous (hyperdrive-menu--entry) 
:cache-only t))
      ;; :transient t
      :description (lambda ()
-                    (if-let ((entry (oref transient--prefix scope)))
+                    (if-let ((entry (hyperdrive-menu--entry)))
                         (concat "Previous"
                                 (pcase-exhaustive (hyperdrive-entry-previous 
entry :cache-only t)
                                   ('unknown (concat ": " (propertize "?" 'face 
'transient-value)))
@@ -100,12 +98,12 @@
                       "Previous")))
     ("V n" "Next" hyperdrive-open-next-version
      :inapt-if-not (lambda  ()
-                     (let ((entry (oref transient--prefix scope)))
+                     (let ((entry (hyperdrive-menu--entry)))
                        (and (hyperdrive-entry-version entry)
                             (hyperdrive-entry-p (hyperdrive-entry-next 
entry)))))
      :description (lambda ()
                     (concat "Next"
-                            (when-let* ((entry (oref transient--prefix scope))
+                            (when-let* ((entry (hyperdrive-menu--entry))
                                         (next-entry (hyperdrive-entry-next 
entry))
                                         ;; Don't add ": latest" if we're 
already at the latest
                                         ;; version or if the next version is 
`unknown'.
@@ -119,15 +117,15 @@
     ("V a" "At..." hyperdrive-open-at-version)
     ("V h" "History" hyperdrive-history
      :inapt-if (lambda ()
-                 (hyperdrive--entry-directory-p (oref transient--prefix 
scope))))]]
+                 (hyperdrive--entry-directory-p (hyperdrive-menu--entry))))]]
   [:if (lambda ()
-         (and (oref transient--prefix scope)
+         (and (hyperdrive-menu--entry)
               ;; TODO: Remove this check and add useful history transient UI.
               (not (eq 'hyperdrive-history-mode major-mode))))
    [;; Current
     :description
     (lambda ()
-      (let ((entry (oref transient--prefix scope)))
+      (let ((entry (hyperdrive-menu--entry)))
         (concat (propertize "Current: " 'face 'transient-heading)
                 (propertize (hyperdrive--format-path (hyperdrive-entry-path 
entry))
                             'face 'transient-value))))
@@ -135,9 +133,9 @@
     ("^" "Up to parent"
      (lambda ()
        (interactive)
-       (hyperdrive-up (oref transient-current-prefix scope)))
+       (hyperdrive-up (hyperdrive-menu--entry)))
      :inapt-if-not (lambda ()
-                     (hyperdrive-parent (oref transient--prefix scope))))
+                     (hyperdrive-parent (hyperdrive-menu--entry))))
     ("s" "Sort" hyperdrive-dir-sort
      :if (lambda ()
            (eq major-mode 'hyperdrive-dir-mode))
@@ -148,14 +146,14 @@
     ("p" "Previous" (lambda ()
                       (interactive)
                       (hyperdrive-ewoc-previous)
-                      (hyperdrive-menu (oref transient--prefix scope)))
+                      (hyperdrive-menu (hyperdrive-menu--entry)))
      :if (lambda ()
            (eq major-mode 'hyperdrive-dir-mode))
      :transient t)
     ("n" "Next" (lambda ()
                   (interactive)
                   (hyperdrive-ewoc-next)
-                  (hyperdrive-menu (oref transient--prefix scope)))
+                  (hyperdrive-menu (hyperdrive-menu--entry)))
      :if (lambda ()
            (eq major-mode 'hyperdrive-dir-mode))
      :transient t)
@@ -167,7 +165,7 @@
            (not (eq major-mode 'hyperdrive-dir-mode)))
      :inapt-if (lambda ()
                  (pcase-let (((cl-struct hyperdrive-entry hyperdrive version)
-                              (oref transient--prefix scope)))
+                              (hyperdrive-menu--entry)))
                    (or version (not (hyperdrive-writablep hyperdrive))))))
     ("d" "Download" hyperdrive-download
      :if (lambda ()
@@ -176,12 +174,12 @@
    ;; "Current" groups when in a directory buffer.
    [;; Selected
     :if (lambda ()
-          (and (oref transient--prefix scope)
+          (and (hyperdrive-menu--entry)
                (eq major-mode 'hyperdrive-dir-mode)
                (hyperdrive-dir--entry-at-point)))
     :description
     (lambda ()
-      (let ((current-entry (oref transient--prefix scope))
+      (let ((current-entry (hyperdrive-menu--entry))
             (selected-entry (hyperdrive-dir--entry-at-point)))
         (concat (propertize "Selected: " 'face 'transient-heading)
                 (propertize
@@ -198,7 +196,7 @@
                    (hyperdrive--entry-directory-p entry-at-point))))
     ("D" "Delete" hyperdrive-delete
      :inapt-if (lambda ()
-                 (let ((current-entry (oref transient--prefix scope))
+                 (let ((current-entry (hyperdrive-menu--entry))
                        (selected-entry (hyperdrive-dir--entry-at-point)))
                    (or (not (hyperdrive-writablep
                              (hyperdrive-entry-hyperdrive current-entry)))
@@ -228,8 +226,7 @@
     ("b j" "Jump" hyperdrive-bookmark-jump)
     ("b l" "List" hyperdrive-bookmark-list)
     ("b s" "Set" bookmark-set
-     :if (lambda ()
-           (oref transient--prefix scope)))]]
+     :if hyperdrive-menu--entry)]]
   (interactive (list hyperdrive-current-entry))
   (transient-setup 'hyperdrive-menu nil nil :scope entry))
 
@@ -241,78 +238,78 @@
    :pad-keys t
    ("d" "Describe" (lambda ()
                      (interactive)
-                     (hyperdrive-describe-hyperdrive (oref 
transient-current-prefix scope))))
+                     (hyperdrive-describe-hyperdrive 
(hyperdrive-menu--entry))))
    ;; FIXME: Is there a better way to intersperse lines of description and 
commands?
    ("" "Public key" ignore
     :description (lambda ()
-                   (concat "Public key: " (hyperdrive--format-host (oref 
transient--prefix scope) :format 'public-key))))
+                   (concat "Public key: " (hyperdrive--format-host 
(hyperdrive-menu--entry) :format 'public-key))))
    ("" "Seed" ignore
     :description (lambda ()
-                   (concat "Seed: " (hyperdrive--format-host (oref 
transient--prefix scope) :format 'seed)))
+                   (concat "Seed: " (hyperdrive--format-host 
(hyperdrive-menu--entry) :format 'seed)))
     :if (lambda ()
-          (hyperdrive-seed (oref transient--prefix scope))))
+          (hyperdrive-seed (hyperdrive-menu--entry))))
    ("p" "Petname" hyperdrive-menu-set-petname
     :transient t
     :description (lambda ()
                    (format "Petname: %s"
                            (if-let ((petname (hyperdrive-petname
-                                              (oref transient--prefix scope))))
+                                              (hyperdrive-menu--entry))))
                                (propertize petname
                                            'face 'hyperdrive-petname)
                              ""))))
    ("n" "set nickname" hyperdrive-menu-set-nickname
     :transient t
     :inapt-if-not (lambda ()
-                    (hyperdrive-writablep (oref transient--prefix scope)))
+                    (hyperdrive-writablep (hyperdrive-menu--entry)))
     :description (lambda ()
                    (format "Nickname: %s"
                            ;; TODO: Hyperdrive-metadata accessor (and maybe gv 
setter).
                            (if-let ((nickname (alist-get 'name
                                                          (hyperdrive-metadata
-                                                          (oref 
transient--prefix scope)))))
+                                                          
(hyperdrive-menu--entry)))))
                                (propertize nickname
                                            'face 'hyperdrive-nickname)
                              ""))))
    ("" "Domain" ignore
     :description (lambda ()
-                   (concat "Domain: " (hyperdrive--format-host (oref 
transient--prefix scope) :format 'domain)))
+                   (concat "Domain: " (hyperdrive--format-host 
(hyperdrive-menu--entry) :format 'domain)))
     :if (lambda ()
-          (hyperdrive-domains (oref transient--prefix scope))))
+          (hyperdrive-domains (hyperdrive-menu--entry))))
    ("" "Latest version" ignore
     :description (lambda ()
-                   (format "Latest version: %s" (hyperdrive-latest-version 
(oref transient--prefix scope)))))]
+                   (format "Latest version: %s" (hyperdrive-latest-version 
(hyperdrive-menu--entry)))))]
   [["Open"
     ("f" "Find file"
      (lambda ()
        (interactive)
        (hyperdrive-open
          (hyperdrive-read-entry
-          :hyperdrive (oref transient-current-prefix scope)
+          :hyperdrive (hyperdrive-menu--entry)
           :read-version current-prefix-arg))))
     ("v" "View file" (lambda ()
                        (interactive)
                        (hyperdrive-view-file
                         (hyperdrive-read-entry
-                         :hyperdrive (oref transient-current-prefix scope)
+                         :hyperdrive (hyperdrive-menu--entry)
                          :read-version current-prefix-arg))))]
    ["Upload"
     ("u f" "File" hyperdrive-menu-upload-file
      :inapt-if-not (lambda ()
-                     (hyperdrive-writablep (oref transient--prefix scope))))
+                     (hyperdrive-writablep (hyperdrive-menu--entry))))
     ("u F" "Files" hyperdrive-menu-upload-files
      :inapt-if-not (lambda ()
-                     (hyperdrive-writablep (oref transient--prefix scope))))
+                     (hyperdrive-writablep (hyperdrive-menu--entry))))
     ;; TODO: When `hyperdrive-mirror' is rewritten with transient.el, set the 
hyperdrive by default to the
     ("u m" "Mirror" hyperdrive-mirror
      :inapt-if-not (lambda ()
-                     (hyperdrive-writablep (oref transient--prefix scope))))]]
+                     (hyperdrive-writablep (hyperdrive-menu--entry))))]]
   (interactive (list (hyperdrive-complete-hyperdrive :force-prompt 
current-prefix-arg)))
   (transient-setup 'hyperdrive-menu-hyperdrive nil nil :scope hyperdrive))
 
 (transient-define-suffix hyperdrive-menu-upload-file (filename entry)
   (interactive
    (let* ((filename (read-file-name "Upload file: "))
-          (entry (hyperdrive-read-entry :hyperdrive (oref 
transient-current-prefix scope)
+          (entry (hyperdrive-read-entry :hyperdrive (hyperdrive-menu--entry)
                                         :default-path (file-name-nondirectory 
filename)
                                         :latest-version t)))
      (list filename entry)))
@@ -320,7 +317,7 @@
 
 (transient-define-suffix hyperdrive-menu-upload-files (files hyperdrive &key 
target-directory)
   (interactive
-   (let ((drive (oref transient-current-prefix scope)))
+   (let ((drive (hyperdrive-menu--entry)))
      (list
       (hyperdrive-read-files)
       drive
@@ -335,20 +332,26 @@
   (interactive
    (list (hyperdrive-read-name
           :prompt "New petname"
-          :initial-input (hyperdrive-petname (oref transient-current-prefix 
scope)))
-         (oref transient-current-prefix scope)))
+          :initial-input (hyperdrive-petname (hyperdrive-menu--entry)))
+         (hyperdrive-menu--entry)))
   (hyperdrive-set-petname petname hyperdrive))
 
 (transient-define-suffix hyperdrive-menu-set-nickname (nickname hyperdrive)
   (interactive
    (list (hyperdrive-read-name
           :prompt "New nickname"
-          :initial-input (alist-get 'name (hyperdrive-metadata (oref 
transient-current-prefix scope))))
-         (oref transient-current-prefix scope)))
+          :initial-input (alist-get 'name (hyperdrive-metadata 
(hyperdrive-menu--entry))))
+         (hyperdrive-menu--entry)))
   (hyperdrive-set-nickname nickname hyperdrive
                            :then (lambda (drive)
                                    (hyperdrive-menu-hyperdrive drive))))
 
+;;;;; Common Utilities
+
+(defun hyperdrive-menu--entry ()
+  "Return the current entry as understood by `hyperdrive-menu'."
+  (oref (or transient--prefix transient-current-prefix) scope))
+
 ;;;; Footer
 
 (provide 'hyperdrive-menu)

Reply via email to