racket/collects/web-server/configuration.ss
Eli Barzilay 3459c3a58f merged units branch
svn: r5033
2006-12-05 20:31:14 +00:00

92 lines
3.9 KiB
Scheme

(module configuration mzscheme
(require (lib "unit.ss")
(lib "kw.ss")
(lib "list.ss")
(lib "contract.ss"))
(require "private/configuration.ss"
"private/configuration-structures.ss"
"private/configuration-table-structs.ss"
"private/util.ss"
"private/parse-table.ss"
"sig.ss")
(define default-configuration-table-path
(build-path (collection-path "web-server") "configuration-table"))
; get-configuration : path -> configuration-table
(define (get-configuration table-file-name)
(parse-configuration-table (call-with-input-file table-file-name read)))
; load-configuration : path -> configuration
(define (load-configuration table-file-name)
(complete-configuration (directory-part table-file-name) (get-configuration table-file-name)))
; load-configuration-sexpr : string? sexp -> configuration
(define/kw (load-configuration-sexpr web-server-root sexpr
#:other-keys bct-keys)
(define table
(parse-configuration-table sexpr))
(define default-host
(apply-default-functions-to-host-table
web-server-root
(configuration-table-default-host table)))
(apply build-configuration table
(lambda (host) default-host)
bct-keys))
; load-developer-configuration : path -> configuration
(define (load-developer-configuration table-file-name)
(complete-developer-configuration
(directory-part table-file-name)
(get-configuration table-file-name)))
; build-developer-configuration : tst -> configuration-table
(define (build-developer-configuration s-expr)
(complete-configuration ; used to be: complete-developer-configuration
(directory-part default-configuration-table-path)
(parse-configuration-table s-expr)))
; : (listof (cons sym TST)) -> configuration
; more here - this is ugly. It also does not catch "unbound identifiers" since I use symbols.
; I considered several other solutions:
; - write the compound unit multiple times (no abstraction)
; - use opt-lambda and pass in 'please-use-the-default for unchanged flags
; - write three different functional updaters and re-compound the unit 1--3 times
(define (update-configuration configuration flags)
(define-unit new-local-config@
(import (prefix raw: web-config/local^))
(export web-config/local^)
(init-depend web-config/local^)
(define port (extract-flag 'port flags raw:port))
(define listen-ip (extract-flag 'ip-address flags raw:listen-ip))
(define instances (extract-flag 'instances flags raw:instances))
(define make-servlet-namespace (extract-flag 'namespace flags raw:make-servlet-namespace)))
(define-unit/new-import-export config@ (import) (export web-config/local^ web-config/pervasive^)
((web-config^) configuration))
(define-compound-unit/infer new-config@
(import)
(export NL web-config/pervasive^)
(link (((L : web-config/local^)) config@)
(((NL : web-config/local^)) new-local-config@ L)))
(unit/new-import-export (import) (export web-config^)
((web-config/local^ web-config/pervasive^) new-config@)))
(provide ; XXX contract
make-make-servlet-namespace
load-configuration-sexpr)
(provide/contract
[complete-configuration (path-string? configuration-table? . -> . configuration?)]
[get-configuration (path-string? . -> . configuration-table?)]
; XXX contract
[build-developer-configuration (list? . -> . configuration?)]
[default-configuration-table-path path?]
[update-configuration (configuration? (listof (cons/c symbol? any/c)) . -> . configuration?)]
[load-configuration (path-string? . -> . configuration?)]
[load-developer-configuration (path-string? . -> . configuration?)]))