# -*- geiser-scheme-implementation: guile -*-
#+TITLE: Babel Library

This library contains code blocks to be used by other files in this repository.

* Converting Lists

Converting org lists into guix ~use-~ calls.

#+NAME: list-to-use
#+begin_src scheme :var use-call="use-modules" :var entries='() :var all-parens=0 :results code pp
  `(,(string->symbol use-call)
    ,@(map (lambda (x)
             (let ((splits (string-split x #\ )))
               (if (and (= (length splits) 1)
                        (= 0 all-parens))
                   (string->symbol (car splits))
                   (map (lambda (y) (string->symbol y))
                        splits))))
           entries))
#+end_src

Converting Org lists into Scheme symbol lists.

#+NAME: org-to-scheme-sym-list
#+begin_src scheme :var input='() :results code pp
  `(list
    ,@(map (lambda (x) (string->symbol x)) input))
#+end_src

* Converting Tables

#+NAME: service-converter
#+begin_src scheme :var input='() :colnames yes :results code pp
  `(list
    ,@(map
       (lambda (row)
         (let ((service-name (car row))
               (configuration (cadr row)))
           `(service ,(string->symbol (string-append service-name "-service-type"))
             (,(string->symbol (string-append service-name "-configuration"))
              ,@(call-with-input-string configuration
                  read)))))
       input))
#+end_src