summaryrefslogtreecommitdiff
path: root/guix/records.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/records.scm')
-rw-r--r--guix/records.scm25
1 files changed, 24 insertions, 1 deletions
diff --git a/guix/records.scm b/guix/records.scm
index 54e1c17752..64581f1be2 100644
--- a/guix/records.scm
+++ b/guix/records.scm
@@ -21,9 +21,12 @@
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
+ #:use-module (ice-9 regex)
+ #:use-module (ice-9 rdelim)
#:export (define-record-type*
alist->record
- object->fields))
+ object->fields
+ recutils->alist))
;;; Commentary:
;;;
@@ -211,4 +214,24 @@ PORT, according to FIELDS. FIELDS must be a list of field name/getter pairs."
(format port "~a: ~a~%" field (get object))
(loop rest)))))
+(define %recutils-field-rx
+ (make-regexp "^([[:graph:]]+): (.*)$"))
+
+(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."
+ (let loop ((line (read-line port))
+ (result '()))
+ (cond ((or (eof-object? line) (string-null? line))
+ (reverse result))
+ ((regexp-exec %recutils-field-rx line)
+ =>
+ (lambda (match)
+ (loop (read-line port)
+ (alist-cons (match:substring match 1)
+ (match:substring match 2)
+ result))))
+ (else
+ (error "unmatched line" line)))))
+
;;; records.scm ends here