X-Git-Url: https://git.jsancho.org/?p=guile-click.git;a=blobdiff_plain;f=click%2Fhelp.scm;fp=click%2Fhelp.scm;h=f397031ab1cdae525403b2ede30e4084e610222a;hp=0000000000000000000000000000000000000000;hb=ebf74b7c3fda8ead57a398bb6a1555067150d06f;hpb=ee290f19711b9e4fb789a0b2a164635e7140a8e5 diff --git a/click/help.scm b/click/help.scm new file mode 100644 index 0000000..f397031 --- /dev/null +++ b/click/help.scm @@ -0,0 +1,81 @@ +;;; Click --- Command Line Interface Creation Kit for GNU Guile +;;; Copyright © 2021 Javier Sancho +;;; +;;; This file is part of Click. +;;; +;;; Click 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. +;;; +;;; Click 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 Click. If not, see . + + +(define-module (click help) + #:use-module (ice-9 format) + #:use-module (click util) + #:export (display-error + display-help)) + + +(define (get-type-description option) + "Return allowed type for the value in the option" + (assoc-ref (option-type option) 'description)) + + +(define (get-title target) + "Return the title for the help message" + (cond ((procedure? target) + (procedure-documentation target)) + (else + target))) + + +(define* (display-help program-name target option-spec #:optional (commands '())) + (format #t "Usage: ~a [OPTIONS] + + ~a + +Options: +" program-name (get-title target)) + + (let* ((options (map (lambda (option) + (cons (format #f + "--~a~a~a" + (car option) + (let ((single-char + (option-property option 'single-char))) + (if single-char + (format #f ", -~a" single-char) + "")) + (let ((value + (not (option-property option 'flag)))) + (if value + (format #f " ~a" (get-type-description option)) + ""))) + (option-property option 'help ""))) + option-spec)) + (sep (+ 2 (apply max (map (lambda (option) + (string-length (car option))) + options))))) + (for-each (lambda (option) + (format #t + " ~a~v_~a~%" + (car option) + (- sep (string-length (car option))) + (cdr option))) + options))) + + +(define (display-error wrong-option) + (format #t "Usage: ~a [OPTIONS] +Try '~a --help' for help. + +Error: No such option: ~a +" (program-name) (program-name) wrong-option))