[Top][All Lists]

[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)


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))

(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 <>

;;; [global]
(define (serialize-smb-conf configuration)
   #~(string-append ;; "[global]\n"
                       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.")

   "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."

  ;; 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
   (string "WORKGROUP")

   (list-of-smb-conf-sections '())
   "List of sections are generated here."))

(define my-smb-conf
   ;; (workgroup "GNU")
      (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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]