~ruther/guix-local

836d10f154275e56c7185c1fcd6daee2027b41de — Ludovic Courtès 12 years ago b0efe83
records: `recutils->alist' recognizes lines starting with a `+'.

* guix/records.scm (%recutils-plus-rx): New variable.
  (recutils->alist): Use it to read + lines.
* tests/records.scm ("recutils->alist with + lines"): New test.
2 files changed, 22 insertions(+), 0 deletions(-)

M guix/records.scm
M tests/records.scm
M guix/records.scm => guix/records.scm +12 -0
@@ 231,6 231,9 @@ PORT, according to FIELDS.  FIELDS must be a list of field name/getter pairs."
  ;; info "(recutils) Comments"
  (make-regexp "^#"))

(define %recutils-plus-rx
  (make-regexp "^\\+ ?(.*)$"))

(define (recutils->alist port)
  "Read a recutils-style record from PORT and return it as a list of key/value
pairs.  Stop upon an empty line (after consuming it) or EOF."


@@ 244,6 247,15 @@ pairs.  Stop upon an empty line (after consuming it) or EOF."
               (reverse result)))                 ; end-of-record marker
          ((regexp-exec %recutils-comment-rx line)
           (loop (read-line port) result))
          ((regexp-exec %recutils-plus-rx line)
           =>
           (lambda (m)
             (match result
               (((field . value) rest ...)
                (loop (read-line port)
                      `((,field . ,(string-append value "\n"
                                                  (match:substring m 1)))
                        ,@rest))))))
          ((regexp-exec %recutils-field-rx line)
           =>
           (lambda (match)

M tests/records.scm => tests/records.scm +10 -0
@@ 158,6 158,16 @@ Version: 1.5
    (list (recutils->alist p)
          (recutils->alist p))))

(test-equal "recutils->alist with + lines"
  '(("Name" . "foo")
    ("Description" . "1st line,\n2nd line,\n 3rd line with extra space,\n4th line without space."))
  (recutils->alist (open-input-string "
Name: foo
Description: 1st line,
+ 2nd line,
+  3rd line with extra space,
+4th line without space.")))

(test-equal "alist->record" '((1 2) b c)
  (alist->record '(("a" . 1) ("b" . b) ("c" . c) ("a" . 2))
                 list