[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Help on writing config serialiser
From: |
Simon Streit |
Subject: |
Help on writing config serialiser |
Date: |
Mon, 24 Jan 2022 17:13:09 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) |
Hello!
I am trying to write a config serialiser for Samba's smb.conf. While
developing the service, I noticed that my current approach should be
done in while using a config serialiser. I modified the example that
is in the manual:
--8<---------------cut here---------------start------------->8---
(use-modules (gnu services)
(guix gexp)
(gnu services configuration)
(srfi srfi-26)
(srfi srfi-1))
;; Turn field names, which are Scheme symbols into strings
(define (uglify-field-name field-name)
(let ((str (symbol->string field-name)))
;; field? -> is-field
(if (string-suffix? "?" str)
(string-append "is-" (string-drop-right str 1))
str)))
(define (serialize-string field-name value)
#~(string-append #$(uglify-field-name field-name) " = " #$value "\n"))
(define (serialize-integer field-name value)
(serialize-string field-name (number->string value)))
(define (serialize-boolean field-name value)
(serialize-string field-name (if value "yes" "no")))
;;; [sections]
(define (serialize-section-name field-name value)
#~(string-append "\n[" #$value "]\n"))
(define (list-of-smb-conf-sections? lst) ;wrong type to apply?!?
(every smb-conf-section? lst))
(define (serialize-list-of-smb-conf-sections field-name value)
#~(string-append #$@(map (cut serialize-configuration <>
smb-conf-section-fields)
value)))
;;; [global]
(define (serialize-smb-conf configuration)
(mixed-text-file
"smb.conf"
#~(string-append ;; "[global]\n"
#$(serialize-configuration
configuration smb-conf-fields))))
(define-maybe integer)
(define-maybe string)
;;; section part
(define-configuration smb-conf-section
;; (package
;; (file-like samba)
;; "The @var{samba} package.")
(section-name
(string)
"Name of section that describes a shared resource, also known as
``share''. The section name is the name of the shared resource and
the parameters withing the section define the shares attributes."
serialize-section-name)
;; From here on all parameter options described in smb.conf(5)
;; should comes below. Currently this list is incomplete, needs
;; testing, and it would be nice to have a converter to easily
;; convert the parameters directly found in Samba's sources.
;; For instance, the manpage for smb.conf is automatically
;; generated. It should be possible to extract this from source,
;; and normalise it here.
(workgroup ;(G)
;; (string "WORKGROUP")
(maybe-string "WORKGROUP")
"This controls what workgroup your server will appear to be in when
queried by clients. Note that this parameter also controls the Domain
name used with the @code{security = domain} setting.
Default: @code{(\"WORKGROUP\")}
Example: @code{(\"MYGROUP\")}"))
;;; main part
(define-configuration smb-conf
(workgroup
(string "WORKGROUP")
"")
(sections
(list-of-smb-conf-sections '())
"List of sections are generated here."))
(define my-smb-conf
(smb-conf
;; (workgroup "GNU")
(sections
(list
(smb-conf-section
(section-name "global")
(workgroup "GNU")
)))
))
--8<---------------cut here---------------end--------------->8---
Unfortunately, this procedure fails with an error:
--8<---------------cut here---------------start------------->8---
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure every: Wrong type argument: #<syntax-transformer smb-conf-section?>
--8<---------------cut here---------------end--------------->8---
And this error is not clear to me yet. I've been stuck at comparing the
example with my version. I'd be happy to receive a bit of help.
Kind regards
Simon
- Help on writing config serialiser,
Simon Streit <=