summaryrefslogtreecommitdiff
path: root/guix/ui.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-04-08 22:01:44 +0200
committerLudovic Courtès <ludo@gnu.org>2014-04-08 22:01:44 +0200
commit1d6243cf70269acdaf32f1ad61beba241f130484 (patch)
treec095e485d515820680f74ae2bd321d00d91190de /guix/ui.scm
parentc397e502ca4f9a929e213e1c728b942a007ee278 (diff)
ui: Add 'size->number'.
* guix/scripts/gc.scm (size->number): Remove. * guix/ui.scm (size->number): New procedure. * tests/ui.scm ("size->number, bytes", "size->number, MiB", "size->number, GiB", "size->number, 1.2GiB", "size->number, invalid unit"): New tests.
Diffstat (limited to 'guix/ui.scm')
-rw-r--r--guix/ui.scm33
1 files changed, 33 insertions, 0 deletions
diff --git a/guix/ui.scm b/guix/ui.scm
index dcad55e72e..944c9f87fa 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -43,6 +43,7 @@
show-version-and-exit
show-bug-report-information
string->number*
+ size->number
show-what-to-build
call-with-error-handling
with-error-handling
@@ -160,6 +161,38 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
(or (string->number str)
(leave (_ "~a: invalid number~%") str)))
+(define (size->number str)
+ "Convert STR, a storage measurement representation such as \"1024\" or
+\"1MiB\", to a number of bytes. Raise an error if STR could not be
+interpreted."
+ (define unit-pos
+ (string-rindex str char-set:digit))
+
+ (define unit
+ (and unit-pos (substring str (+ 1 unit-pos))))
+
+ (let* ((numstr (if unit-pos
+ (substring str 0 (+ 1 unit-pos))
+ str))
+ (num (string->number numstr)))
+ (unless num
+ (leave (_ "invalid number: ~a~%") numstr))
+
+ ((compose inexact->exact round)
+ (* num
+ (match unit
+ ("KiB" (expt 2 10))
+ ("MiB" (expt 2 20))
+ ("GiB" (expt 2 30))
+ ("TiB" (expt 2 40))
+ ("KB" (expt 10 3))
+ ("MB" (expt 10 6))
+ ("GB" (expt 10 9))
+ ("TB" (expt 10 12))
+ ("" 1)
+ (_
+ (leave (_ "unknown unit: ~a~%") unit)))))))
+
(define (call-with-error-handling thunk)
"Call THUNK within a user-friendly error handler."
(guard (c ((package-input-error? c)