aboutsummaryrefslogtreecommitdiff
path: root/scripts/yaml.scm
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/yaml.scm')
-rw-r--r--scripts/yaml.scm85
1 files changed, 0 insertions, 85 deletions
diff --git a/scripts/yaml.scm b/scripts/yaml.scm
deleted file mode 100644
index f940911..0000000
--- a/scripts/yaml.scm
+++ /dev/null
@@ -1,85 +0,0 @@
-;;
-;; scm->yaml
-;;
-;; This file implements a library to convert a scm tree to yaml.
-
-(define-module (yaml)
- #:use-module (ice-9 match)
- #:export (scm->yaml))
-
-(define (kebab->camel string)
- "Convert STRING from kebab case to CAMEL case."
- (match (string-split string #\-)
- ((head tail ...)
- (string-concatenate
- (cons head (map string-titlecase tail))))))
-
-(define (display-atom atom port)
- "Display ATOM in PORT converting from kebab case to camel case if
-ATOM is a symbol."
- (cond
- ((symbol? atom)
- (display (string->symbol (kebab->camel (symbol->string atom))) port))
- ((number? atom)
- (display atom port))
- ((string? atom)
- ;; Escape string with double quotes if
- ;; - every character is a digit or period, and the unescaped
- ;; string can therefore be misinterpreted as a number
- ;; - string contains the colon character
- (if (or (string-every (char-set-union char-set:digit (char-set #\.)) atom)
- (string-any #\: atom))
- (write atom port)
- (display atom port)))
- ((boolean? atom)
- (display (if atom "true" "false") port))
- (else (error "Unknown atom" atom))))
-
-(define (indent-level port level)
- "Emit whitespaces to PORT corresponding to nesting LEVEL."
- (display (make-string (* 2 level) #\space) port))
-
-(define (display-array-element element port level)
- "Display array ELEMENT to PORT at nesting LEVEL."
- (display "- " port)
- (scm->yaml element port (1+ level)))
-
-(define (display-dictionary-entry entry port level)
- "Display dictionary ENTRY to PORT at nesting LEVEL."
- (match entry
- ((key . value)
- (display-atom key port)
- (display ":" port)
- (match value
- ((or #(_ ...)
- ((_ . _) (_ . _) ...))
- (newline port)
- (indent-level port (1+ level))
- (scm->yaml value port (1+ level)))
- (_ (display " " port)
- (scm->yaml value port level))))))
-
-(define* (scm->yaml scm #:optional (port (current-output-port)) (level 0))
- "Convert SCM, an S-expression tree, to YAML and display to
-PORT. LEVEL is an internal recursion variable."
- (match scm
- (#(head tail ...)
- (display-array-element head port level)
- (for-each (lambda (element)
- (indent-level port level)
- (display-array-element element port level))
- tail))
- (#()
- (display "[]" port))
- ((head tail ...)
- (display-dictionary-entry head port level)
- (for-each (lambda (entry)
- (indent-level port level)
- (display-dictionary-entry entry port level))
- tail))
- (()
- (display "{}" port)
- (newline port))
- (symbol
- (display-atom symbol port)
- (newline port))))