Skip to content

Instantly share code, notes, and snippets.

@greghendershott
Created April 12, 2019 17:13
Show Gist options
  • Save greghendershott/e73c4eecba9dd19c5759499cb272e8d5 to your computer and use it in GitHub Desktop.
Save greghendershott/e73c4eecba9dd19c5759499cb272e8d5 to your computer and use it in GitHub Desktop.
;; <base-name> is used both (1) to define a parameter named
;; current-<base-name> and (2) to get an environment variable named
;; "WEB_<BASE_NAME>" (note conversion of kebab-case to SNAKE_CASE).
(define-syntax-parser dp
[(_ base-name:id
default:expr
contract:expr
(~optional (~seq #:coerce coerce:expr) #:defaults ([coerce #'values]))
(~optional (~seq #:secret? secret?:boolean) #:defaults ([secret? #'#f])))
(with-syntax ([id-name (format-id #'base-name
"current-~a"
(syntax-e #'base-name))]
[env-name (string-upcase
(regexp-replace* #px"-"
(format "WEB_~a"
(syntax-e #'base-name))
"_"))])
#'(begin
(define/contract id-name (parameter/c contract)
(make-parameter (match (getenv env-name)
[#f default]
[v (coerce v)])))
(provide id-name)
(unless secret?
(hash-set! non-secret 'id-name id-name))))])
;; e.g.
(dp external-port 8080 port-num? #:coerce string->number)
;; defines `current-external-port` defaulting to env var WEB_EXTERNAL_PORT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment