(define-module (email-key-rotation gandi) #:use-module (srfi srfi-26) #:use-module (srfi srfi-9 gnu) #:use-module (ice-9 optargs) #:use-module (ice-9 exceptions) #:use-module (ice-9 match) #:use-module (sxml match) #:use-module (web client) #:use-module (web uri) #:export ( make-gandi-configuration gandi-configuration? api-key set-api-key domain set-domain sxml->configuration configuration->sxml gandi-livedns-request) #:declarative? #t) (define-immutable-record-type (make-gandi-configuration api-key domain) gandi-configuration? (api-key api-key set-api-key) (domain domain set-domain)) (define* (gandi-livedns-request configuration domain path-under-domain #:key (method 'GET) (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-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 #:method method #:headers headers #:body body))))) (define (sxml->configuration sxml) (with-exception-handler (lambda (exn) (raise-exception (make-exception (make-error) (make-exception-with-origin 'sxml->configuration) (make-exception-with-irritants (list sxml)) (make-exception-with-message "cannot read the XML fragment as a gandi configuration.") exn))) (lambda () (sxml-match sxml ((https://planete-kraus.eu/ns/email-key-rotation:gandi-configuration (@ (api-key ,api-key) (domain ,domain))) (make-gandi-configuration api-key domain)))))) (define (configuration->sxml gandi) (with-exception-handler (lambda (exn) (raise-exception (make-exception (make-exception-with-origin 'configuration->sxml) (make-exception-with-irritants (list gandi)) (make-exception-with-message "when converting a gandi configuration to SXML:") exn))) (lambda () (match gandi (($ api-key domain) `(gandi-configuration (@ (api-key ,api-key) (domain ,domain))))))))