aboutsummaryrefslogtreecommitdiffstats
path: root/gitto/ui.scm
blob: 093e784aad105aef79d13a7fdd823429f342ef77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;; gitto -- Keep track of your git repositories
;; Copyright (C) 2012 Tom Willemse <tom at ryuslash dot org>

;; This file is part of gitto.

;; gitto is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; gitto is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with gitto.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gitto ui)
  #:use-module (ice-9 format)
  #:use-module (ice-9 i18n)
  #:use-module (ice-9 rdelim)
  #:export (y-or-n?
            choose))

(define* (y-or-n? prompt #:key (default #f))
  (format #t "~a [~a] " prompt (if default "Y/n" "y/N"))
  (let ((char (read-char)))

    ;; Clear the rest of the input buffer.
    (unless (eq? char #\newline)
      (read-line))

    (case char
      ((#\y #\Y #\newline) #t)
      ((#\n #\N) #f)
      (else
       (display "Invalid response, please use `y' or `n'.")
       (newline)
       (y-or-n? prompt #:default default)))))

(define* (choose collection prompt #:optional (key identity))
  "Ask the user to choose one of COLLECTION.

PROMPT is the question to ask the user and KEY is the function to use
to present the options to the user."
  (format #t "~a~%~%Choose one:~%~%" prompt)

  (do ((idx 1 (1+ idx))
       (cll collection (cdr cll)))
      ((null? cll))
    (format #t "~3d. ~a~%" idx (key (car cll))))

  (newline)
  (display "Your Choice: ")

  (let ((response (locale-string->integer (read-line))))
    (if (and response (<= 1 response (length collection)))
        (list-ref collection (1- response))
        (begin
          (format #t "Improper response.~%")
          (choose collection prompt key)))))