From 52be1ce95097ce7d216be7e5a5d0cc73e84ce686 Mon Sep 17 00:00:00 2001
From: Alex Shinn <ashinn@users.noreply.github.com>
Date: Wed, 14 May 2014 23:52:29 +0900
Subject: [PATCH] Parsing non-string values from options.

---
 lib/chibi/app.scm | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/lib/chibi/app.scm b/lib/chibi/app.scm
index 3b2453fb..4ecfe7cd 100644
--- a/lib/chibi/app.scm
+++ b/lib/chibi/app.scm
@@ -5,6 +5,20 @@
 ;;> Parses command-line options into a config object.
 
 (define (parse-option prefix conf-spec args fail)
+  (define (parse-value type str)
+    (cond
+     ((not (string? str))
+      str)
+     ((and (pair? type) (eq? 'list (car type)))
+      (map (lambda (x) (parse-value (cadr type) x))
+           (string-split str #\,)))
+     (else
+      (case type
+        ((boolean) (not (member str '("#f" "#false" "#F" "#FALSE"))))
+        ((number) (string->number str))
+        ((symbol) (string->symbol str))
+        ((char) (string-ref str 0))
+        (else str)))))
   (define (lookup-conf-spec conf-spec syms strs)
     (let ((sym (car syms))
           (str (car strs)))
@@ -55,12 +69,13 @@
        ((null? args)
         (error "missing argument to option " str))
        (else
-        (cons (cons (append prefix syms) (car args)) (cdr args))))))
+        (cons (cons (append prefix syms) (parse-value (cadr spec) (car args)))
+              (cdr args))))))
   (define (parse-long-option str args)
     (let* ((str+val (string-split str #\= 2))
            (str (car str+val))
-           (args (if (pair? (cdr str+val)) (cons (cadr str+val) args) args)))
-      (or (parse-conf-spec str args)
+           (args2 (if (pair? (cdr str+val)) (cons (cadr str+val) args) args)))
+      (or (parse-conf-spec str args2)
           (and (string-prefix? "no-" str)
                (let ((res (parse-long-option (substring str 3) args)))
                  (cond
@@ -88,7 +103,9 @@
                   args
                   (cons (string-append "-" (substring str 1)) args))))
        ((> (string-length str) 1)
-        (cons (cons (append prefix (list (car x))) (substring str 1)) args))
+        (cons (cons (append prefix (list (car x)))
+                    (parse-value (cadr x) (substring str 1)))
+              args))
        ((null? args)
         (error "missing argument to option " x))
        (else