ui: Add `args-fold*' and use it.

* guix/ui.scm (args-fold*): New procedure.
* guix/scripts/build.scm, guix/scripts/download.scm,
  guix/scripts/gc.scm, guix/scripts/hash.scm, guix/scripts/import.scm,
  guix/scripts/package.scm, guix/scripts/pull.scm,
  guix/scripts/refresh.scm: Use `args-fold*' instead of `args-fold'.
This commit is contained in:
Ludovic Courtès 2013-04-27 16:46:39 +02:00
parent 14e2afa74b
commit a5975cedf2
9 changed files with 63 additions and 49 deletions

View file

@ -149,12 +149,12 @@ (define %options
(define (guix-build . args) (define (guix-build . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(define (register-root paths root) (define (register-root paths root)
;; Register ROOT as an indirect GC root for all of PATHS. ;; Register ROOT as an indirect GC root for all of PATHS.

View file

@ -90,12 +90,12 @@ (define fmt-proc
(define (guix-download . args) (define (guix-download . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(with-error-handling (with-error-handling
(let* ((opts (parse-options)) (let* ((opts (parse-options))

View file

@ -141,12 +141,12 @@ (define %options
(define (guix-gc . args) (define (guix-gc . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(define (symlink-target file) (define (symlink-target file)
(let ((s (false-if-exception (lstat file)))) (let ((s (false-if-exception (lstat file))))

View file

@ -90,13 +90,13 @@ (define fmt-proc
(define (guix-hash . args) (define (guix-hash . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "unrecognized option: ~a~%") (leave (_ "unrecognized option: ~a~%")
name)) name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(let* ((opts (parse-options)) (let* ((opts (parse-options))
(args (filter-map (match-lambda (args (filter-map (match-lambda

View file

@ -95,12 +95,12 @@ (define %options
(define (guix-import . args) (define (guix-import . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(let* ((opts (parse-options)) (let* ((opts (parse-options))
(args (filter-map (match-lambda (args (filter-map (match-lambda

View file

@ -446,12 +446,12 @@ (define %options
(define (guix-package . args) (define (guix-package . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(leave (_ "~A: extraneous argument~%") arg)) (leave (_ "~A: extraneous argument~%") arg))
%default-options)) %default-options))
(define (guile-missing?) (define (guile-missing?)
;; Return #t if %GUILE-FOR-BUILD is not available yet. ;; Return #t if %GUILE-FOR-BUILD is not available yet.

View file

@ -173,12 +173,12 @@ (define %options
(define (guix-pull . args) (define (guix-pull . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(leave (_ "~A: unexpected argument~%") arg)) (leave (_ "~A: unexpected argument~%") arg))
%default-options)) %default-options))
(with-error-handling (with-error-handling
(let ((opts (parse-options)) (let ((opts (parse-options))

View file

@ -93,12 +93,12 @@ (define (show-help)
(define (guix-refresh . args) (define (guix-refresh . args)
(define (parse-options) (define (parse-options)
;; Return the alist of option values. ;; Return the alist of option values.
(args-fold args %options (args-fold* args %options
(lambda (opt name arg result) (lambda (opt name arg result)
(leave (_ "~A: unrecognized option~%") name)) (leave (_ "~A: unrecognized option~%") name))
(lambda (arg result) (lambda (arg result)
(alist-cons 'argument arg result)) (alist-cons 'argument arg result))
%default-options)) %default-options))
(define core-package? (define core-package?
(let* ((input->package (match-lambda (let* ((input->package (match-lambda

View file

@ -29,6 +29,7 @@ (define-module (guix ui)
#:use-module (srfi srfi-11) #:use-module (srfi srfi-11)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (srfi srfi-34) #:use-module (srfi srfi-34)
#:use-module (srfi srfi-37)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 format) #:use-module (ice-9 format)
#:export (_ #:export (_
@ -46,6 +47,7 @@ (define-module (guix ui)
fill-paragraph fill-paragraph
string->recutils string->recutils
package->recutils package->recutils
args-fold*
run-guix-command run-guix-command
program-name program-name
guix-warning-port guix-warning-port
@ -370,6 +372,18 @@ (define (description->recutils str)
(and=> (package-description p) description->recutils)) (and=> (package-description p) description->recutils))
(newline port)) (newline port))
(define (args-fold* options unrecognized-option-proc operand-proc . seeds)
"A wrapper on top of `args-fold' that does proper user-facing error
reporting."
(catch 'misc-error
(lambda ()
(apply args-fold options unrecognized-option-proc
operand-proc seeds))
(lambda (key proc msg args . rest)
;; XXX: MSG is not i18n'd.
(leave (_ "invalid argument: ~a~%")
(apply format #f msg args)))))
(define (show-guix-usage) (define (show-guix-usage)
;; TODO: Dynamically generate a summary of available commands. ;; TODO: Dynamically generate a summary of available commands.
(format (current-error-port) (format (current-error-port)