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