~ruther/guix-local

9af7ecd9591b4eff41389291bbc586dcf09e2665 — Huang Ying 9 years ago bacc1d2
services: dicod: Allow the configuration of "handlers".

* gnu/services/dict.scm (<dicod-configuration>)[handlers]: New field.
(<dicod-handler>): New record type.
(<dicod-database>): Add fields.
(dicod-configuration-file): Support convert handlers and enhanced databases.
configuration to config file.
* doc/guix.texi (Miscellaneous Services): Update accordingly.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2 files changed, 92 insertions(+), 14 deletions(-)

M doc/guix.texi
M gnu/services/dict.scm
M doc/guix.texi => doc/guix.texi +47 -5
@@ 14370,25 14370,49 @@ This is the list of IP addresses and ports and possibly socket file
names to listen to (@pxref{Server Settings, @code{listen} directive,,
dico, GNU Dico Manual}).

@item @code{handlers} (default: @var{'()})
List of @code{<dicod-handler>} objects denoting handlers (module instances).

@item @code{databases} (default: @var{(list %dicod-database:gcide)})
List of @code{<dicod-database>} objects denoting dictionaries to be served.
@end table
@end deftp

@deftp {Data Type} dicod-database
Data type representing a dictionary database.
@deftp {Data Type} dicod-handler
Data type representing a dictionary handler (module instance).

@table @asis
@item @code{name}
Name of the database, will be used in DICT commands.
Name of the handler (module instance).

@item @code{module}
Name of the dicod module used by this database
@item @code{module} (default: @var{#f})
Name of the dicod module of the handler (instance).  If it is @code{#f},
the module has the same name as the handler.
(@pxref{Modules,,, dico, GNU Dico Manual}).

@item @code{options}
List of strings or gexps representing the arguments for the module handler
@end table
@end deftp

@deftp {Data Type} dicod-database
Data type representing a dictionary database.

@table @asis
@item @code{name}
Name of the database, will be used in DICT commands.

@item @code{handler}
Name of the dicod handler (module instance) used by this database
(@pxref{Handlers,,, dico, GNU Dico Manual}).

@item @code{complex?} (default: @var{#f})
Whether the database configuration complex.  The complex configuration
will need a corresponding @code{<dicod-handler>} object, otherwise not.

@item @code{options}
List of strings or gexps representing the arguments for the database
(@pxref{Databases,,, dico, GNU Dico Manual}).
@end table
@end deftp



@@ 14397,6 14421,24 @@ A @code{<dicod-database>} object serving the GNU Collaborative International
Dictonary of English using the @code{gcide} package.
@end defvr

The following is an example @code{dicod-service} configuration.

@example
(dicod-service #:config
  (dicod-configuration
   (handlers (list (dicod-handler
                    (name "wordnet")
                    (module "dictorg")
                    (options
                     (list #~(string-append "dbdir=" #$wordnet))))))
   (databases (list (dicod-database
                     (name "wordnet")
                     (complex? #t)
                     (handler "wordnet")
                     (options '("database=wn")))
                    %dicod-database:gcide))))
@end example

@subsubsection Version Control

The @code{(gnu services version-control)} module provides the following services:

M gnu/services/dict.scm => gnu/services/dict.scm +45 -9
@@ 1,6 1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Sou Bunnbu <iyzsong@gmail.com>
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Huang Ying <huang.ying.caritas@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 32,6 33,7 @@
  #:export (dicod-service
            dicod-service-type
            dicod-configuration
            dicod-handler
            dicod-database
            %dicod-database:gcide))



@@ 46,21 48,30 @@
  (dico        dicod-configuration-dico       (default dico))
  (interfaces  dicod-configuration-interfaces     ;list of strings
               (default '("localhost")))
  (databases   dicod-configuration-databases
               ;; list of <dicod-database>
  (handlers    dicod-configuration-handlers       ;list of <dicod-handler>
               (default '()))
  (databases   dicod-configuration-databases      ;list of <dicod-database>
               (default (list %dicod-database:gcide))))

(define-record-type* <dicod-handler>
  dicod-handler make-dicod-handler
  dicod-handler?
  (name        dicod-handler-name)
  (module      dicod-handler-module          (default #f))
  (options     dicod-handler-options         (default '())))

(define-record-type* <dicod-database>
  dicod-database make-dicod-database
  dicod-database?
  (name        dicod-database-name)
  (module      dicod-database-module)
  (handler     dicod-database-handler)
  (complex?    dicod-database-complex?       (default #f))
  (options     dicod-database-options        (default '())))

(define %dicod-database:gcide
  (dicod-database
   (name "gcide")
   (module "gcide")
   (handler "gcide")
   (options (list #~(string-append "dbdir=" #$gcide "/share/gcide")
                  "idxdir=/var/run/dicod"))))



@@ 76,22 87,47 @@
         (shell (file-append shadow "/sbin/nologin")))))

(define (dicod-configuration-file config)
  (define handler->text
    (match-lambda
      (($ <dicod-handler> name #f '())
       `("
load-module " ,name ";"))
      (($ <dicod-handler> name #f options)
       (handler->text (dicod-handler
                       (name name)
                       (module name)
                       (options options))))
      (($ <dicod-handler> name module options)
       `("
load-module " ,name " {
   command \"" ,module (string-join (list ,@options) " " 'prefix) "\";
}\n"))))

  (define database->text
    (match-lambda
      (($ <dicod-database> name module options)
      (($ <dicod-database> name handler #f options)
       (append
        (handler->text (dicod-handler
                        (name handler)))
        (database->text (dicod-database
                         (name name)
                         (handler handler)
                         (complex? #t)
                         (options options)))))
      (($ <dicod-database> name handler complex? options)
       `("
load-module " ,module ";
database {
   name \"" ,name "\";
   handler \"" ,module
   handler \"" ,handler
   (string-join (list ,@options) " " 'prefix) "\";
}\n"))))

  (define configuration->text
    (match-lambda
      (($ <dicod-configuration> dico (interfaces ...) databases)
      (($ <dicod-configuration> dico (interfaces ...) handlers databases)
       (append `("listen ("
                 ,(string-join interfaces ", ") ");\n")
               (append-map handler->text handlers)
               (append-map database->text databases)))))

  (apply mixed-text-file "dicod.conf" (configuration->text config)))