From: Javier Sancho Date: Sun, 12 Sep 2021 08:39:50 +0000 (+0200) Subject: Type conversion X-Git-Url: https://git.jsancho.org/?p=guile-click.git;a=commitdiff_plain;h=6d51ec37e2379849f195976753e4b6919c0cfe1d Type conversion --- diff --git a/Makefile.am b/Makefile.am index 7246140..0e24758 100644 --- a/Makefile.am +++ b/Makefile.am @@ -42,7 +42,8 @@ SOURCES = \ click.scm \ click/constant.scm \ click/display.scm \ - click/util.scm + click/util.scm \ + click/value.scm TESTS = \ tests/util.scm diff --git a/click/display.scm b/click/display.scm index dab99b0..968a063 100644 --- a/click/display.scm +++ b/click/display.scm @@ -24,17 +24,9 @@ display-help)) -(define (get-option-type option) +(define (get-type-description option) "Return allowed type for the value in the option" - (let ((default (option-property option 'default))) - (cond ((not default) - "TEXT") - ((integer? default) - "INTEGER") - ((number? default) - "NUMBER") - (else - "TEXT")))) + (assoc-ref (option-type option) 'description)) (define (display-help procedure option-spec) (format #t "Usage: ~a [OPTIONS] @@ -56,7 +48,7 @@ Options: (let ((value (not (option-property option 'flag)))) (if value - (format #f " ~a" (get-option-type option)) + (format #f " ~a" (get-type-description option)) ""))) (option-property option 'help ""))) option-spec)) @@ -64,7 +56,11 @@ Options: (string-length (car option))) options))))) (for-each (lambda (option) - (format #t " ~a~v_~a~%" (car option) (- sep (string-length (car option))) (cdr option))) + (format #t + " ~a~v_~a~%" + (car option) + (- sep (string-length (car option))) + (cdr option))) options))) (define (display-error wrong-option) diff --git a/click/util.scm b/click/util.scm index 8a4f771..c3ac062 100644 --- a/click/util.scm +++ b/click/util.scm @@ -18,11 +18,10 @@ (define-module (click util) - #:use-module (ice-9 getopt-long) - #:use-module (ice-9 readline) #:use-module (click constant) #:export (getopt-long-option-spec option-property + option-type program-name %program-name)) @@ -31,7 +30,9 @@ (define (program-name) (fluid-ref %program-name)) + (define (getopt-long-option-spec option-spec) + "Transform click option spec into getopt-long format" (map (lambda (option) (cons (car option) (cons (list 'value (not (option-property option 'flag))) @@ -40,8 +41,34 @@ (cdr option))))) option-spec)) + (define* (option-property option property-name #:optional (default #f)) + "Return the option property with a given name" (let ((property (assq property-name (cdr option)))) (if property (cadr property) default))) + + +;; Types +(define TYPE-TEXT + `((description . "TEXT") + (convert . ,identity))) +(define TYPE-INTEGER + `((description . "INTEGER") + (convert . ,string->number))) +(define TYPE-NUMBER + `((description . "NUMBER") + (convert . ,string->number))) + +(define (option-type option) + "Return allowed type for the value in the option" + (let ((default (option-property option 'default))) + (cond ((not default) + TYPE-TEXT) + ((integer? default) + TYPE-INTEGER) + ((number? default) + TYPE-NUMBER) + (else + TYPE-TEXT)))) diff --git a/click/value.scm b/click/value.scm index ec00445..f42eb2f 100644 --- a/click/value.scm +++ b/click/value.scm @@ -32,14 +32,25 @@ (else (let* ((option (car option-spec)) (option-name (car option)) - (value (or (option-ref values option-name #f) - (get-option-default-value option)))) + (value (get-normalized-value values option option-name))) (cons (cons option-name value) (get-values (cdr option-spec) values)))))) +(define (get-normalized-value values option option-name) + "Get value for option, converting from string to the appropriate value" + (let ((convert-proc (assoc-ref (option-type option) 'convert)) + (value (option-ref values option-name #f))) + (cond ((and value (not (option-property option 'flag))) + (convert-proc value)) + (value + value) + (else + (get-option-default-value option))))) + + (define* (get-option-default-value option #:optional (no-prompt #f)) - "Get value for option, asking user if prompt property is set" + "Get default value for option, asking user if prompt property is set" (let ((default (option-property option 'default))) (if (not default) (let ((prompt (option-property option 'prompt)))