summaryrefslogtreecommitdiff
path: root/guile/email-key-rotation/openstmpd.scm
blob: 9ca2fab634e42918fd831c6b874bfb65d75a5dbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
(define-module (email-key-rotation gandi)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-9 gnu)
  #:use-module (ice-9 optargs)
  #:export (<opensmtpd-configuration>
	    make-openstmpd-configuration
	    opensmtpd-configuration?
	    api-key set-api-key
	    domain set-domain
	    gandi-livedns-request)
  #:declarative? #t)

(define-immutable-record-type <gandi-configuration>
  (make-gandi-configuration api-key domain)
  gandi-configuration?
  (api-key api-key set-api-key)
  (domain domain set-domain))

(define* (gandi-livedns-request configuration
				path-under-domain
				#:key
				(headers '())
				(body #f)
				(http-request http-request))
  (with-exception-handler
      (lambda (exn)
	(raise-exception
	 (make-exception
	  (make-exception-with-origin 'gandi-http-request)
	  (make-exception-with-irritants (list configuration
					       path-under-domain
					       headers
					       body))
	  (make-exception-with-message
	   "cannot request Gandi livedns.")
	  exn)))
    (lambda ()
      (unless (list? path-under-domain)
	(raise-exception
	 (make-error)
	 (make-exception-with-irritants (list path-under-domain))
	 (make-exception-with-message
	  "the PATH-UNDER-DOMAIN argument must be a list of path items.")))
      (let ((uri (build-uri
		  'https
		  #:host "api.gandi.net"
		  #:path
		  (string-append
		   "/"
		   (encode-and-join-uri-path
		    `("v5"
		      "livedns"
		      "domains"
		      ,domain
		      ,@path-under-domain)))))
	    (headers
	     `((Authorization
		. ,(string-append "ApiKey " (api-key configuration)))
	       ,@headers)))
	(http-request uri #:headers headers #:body body)))))