~ chicken-core (chicken-5) 8214de96adaae257620c1cca968af78965aff590
commit 8214de96adaae257620c1cca968af78965aff590 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Oct 21 12:03:46 2016 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Nov 13 11:41:48 2016 +0100 overhauled egg-file validation diff --git a/egg-information.scm b/egg-information.scm index 98c1ce53..6988a4d8 100644 --- a/egg-information.scm +++ b/egg-information.scm @@ -1,52 +1,73 @@ ;;; loading and accessing egg-information -(define toplevel-items - '(synopsis authors category license version dependencies synopsis - test-dependencies build-dependencies components foreign-dependencies - platform doc-from-wiki installed-files)) - -(define valid-items - (append toplevel-items - '(synopsis authors category license version dependencies files - source-file csc-options test-dependencies destination linkage - build-dependencies components foreign-dependencies link-options - custom-bulild target host platform doc-from-wiki extension - program data))) - -(define nested-items - '(components target host extension program data)) - -(define named-items - '(extension program data c-include scheme-include)) +;;; validate egg-information tree +(define (egg-version? v) + (and (list? v) + (pair? v) + (null? (cdr v)) + (let ((str (->string (car v)))) + (irregex-match '(seq (+ numeric) #\. (+ numeric) #\. (+ numeric)) str)))) -;;; validate egg-information tree +;; ENTRY = (NAME TOPLEVEL? NESTED? NAMED? [VALIDATOR]) +(define egg-info-items + `((synopsis #t #f #f) + (authors #t #f #f) + (author #t #f #f) + (category #t #f #f) + (license #t #f #f) + (version #t #f #f ,egg-version?) + (dependencies #t #f #f ,list?) + (test-dependencies #t #f #f ,list?) + (build-dependencies #t #f #f ,list?) + (components #t #f #f) + (foreign-dependencies #t #f #f ,list?) + (platform #t #f #f) + (doc-from-wiki #t #f #f) + (installed-files #t #f #f ,list?) + (maintainers #t #f #f) + (maintainer #t #f #f) + (files #f #t #f ,list?) + (source-file #f #f #f) + (csc-options #f #f #f) + (link-options #f #f #f) + (custom-build #f #f #f) + (target #f #t #f) + (host #f #t #f) + (extension #f #t #t) + (program #f #t #t) + (data #f #t #t) + (c-include #f #f #t) + (scheme-include #f #f #t))) (define (validate-egg-info info) - (define (valid-item? item) - (and (list? item) (pair? item) (symbol? (car item)))) - (define (toplevel-item? item) - (and (valid-item? item) (memq (car item) toplevel-items))) - (unless (list? info) - (error "egg-information has invalid structure" info)) - (unless (every toplevel-item? info) - (error "egg-information has invalid toplevel structure" info)) - (define (validate info) + (define (validate info top?) (for-each (lambda (item) - (unless (valid-item? item) - (error "egg-information item has invalid structure" item)) - (when (and (memq (car item) named-items) (not (symbol? (cadr item)))) - (error "missing name for item" item)) - (if (memq (car item) nested-items) - (validate (if (memq (car item) named-items) - (cddr item) - (cdr item))) - (unless (memq (car item) valid-items) - (error "invalid item" item)))) + (cond ((or (not (pair? item)) + (not (list? item)) + (not (symbol? (car item)))) + (error "invalid egg information item" item)) + ((assq (car item) egg-info-items) => + (lambda (a) + (apply (lambda (_ toplevel nested named #!optional validator) + (when (and top? (not toplevel)) + (error "egg information item not allowed at toplevel" + item)) + (when (and named + (or (null? (cddr item)) + (not (symbol? (caddr item))))) + (error "unnamed egg information item" item)) + (when (and validator + (not (validator (cdr item)))) + (error "egg information item has invalid structure" item)) + (when nested + (validate (if named (cddr item) (cdr item)) #f))) + a))) + (else (error "unknown egg information item" item)))) info)) - (validate info) + (validate info #t) info)Trap