summaryrefslogtreecommitdiff
path: root/split-spec.scm
blob: 6111b17c696cb7b71de4c82d4c30e24b3b381cb6 (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
61
62
63
(use-modules (aws cloudformation utils)
             (aws cloudformation utils json)
             (ice-9 match)
             (srfi srfi-1))

(define spec
  (call-with-input-file "cloudformation-spec.json" read-json))
(define spec-version (json-assoc-ref spec "ResourceSpecificationVersion"))
(define properties-by-service (make-hash-table))
(define resources-by-service (make-hash-table))

(define (parse-service-name name)
  (match (delete "" (string-split name #\:))
    (("Tag") "Universal")
    ((_ service . _) service)))

(define (add-to-group table type-spec)
  (match type-spec
    ((name . details)
     (let* ((service (parse-service-name name))
            (existing-stuff (or (hash-ref table service) '())))
       (hash-set! table
                  service
                  (cons type-spec existing-stuff))))))

(for-each (lambda (property)
            (add-to-group properties-by-service property))
          (json-assoc-ref spec "PropertyTypes"))
(for-each (lambda (property)
            (add-to-group resources-by-service property))
          (json-assoc-ref spec "ResourceTypes"))

(define (hash-table-keys table)
  (hash-fold (lambda (k v memo) (cons k memo)) '() table))

(define services
  (sort (lset-union string=?
                    (hash-table-keys properties-by-service)
                    (hash-table-keys resources-by-service))
        string<))

(for-each (lambda (service)
            (let* ((module-suffix (symbol->string (aws-string->symbol service)))
                   (file-name (string-append "aws/cloudformation/"
                                             module-suffix ".cfn")))
              (display "create ")
              (display file-name)
              (newline)
              (call-with-output-file file-name
                (lambda (port)
                  (let ((properties (or (hash-ref properties-by-service service)
                                        '()))
                        (resources (or (hash-ref resources-by-service service)
                                       '())))
                    (write `(("ModuleSuffix" . ,module-suffix)
                             ,@(if (string=? service "Universal")
                                   `(("ResourceSpecificationVersion" .
                                      ,spec-version))
                                   '())
                             ("PropertyTypes" . ,properties)
                             ("ResourceTypes" . ,resources))
                           port))))))
          services)