aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program/aedifex.lux
blob: a05dee43003322493b8b7d041e3ce1a524dd78c8 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
(.module:
  [lux (#- Name)
   [abstract
    [monad (#+ do)]]
   [control
    [pipe (#+ do>)]
    ["." io (#+ IO)]
    ["." try (#+ Try)]
    ["." exception (#+ exception:)]
    [parser
     ["." cli (#+ program:)]
     ["<c>" code]]
    [security
     ["!" capability]]
    [concurrency
     ["." promise (#+ Promise) ("#@." monad)]]]
   [data
    [binary (#+ Binary)]
    ["." text
     ["%" format (#+ format)]
     ["." encoding]]
    [format
     ["." xml]]
    [collection
     ["." set]
     ["." dictionary (#+ Dictionary)]]]
   [tool
    [compiler
     [language
      [lux
       ["." syntax]]]]]
   [world
    ["." file (#+ Path)]]]
  ["." / #_
   ["#" profile]
   ["#." action (#+ Action)]
   ["#." project (#+ Project)]
   ["#." input]
   ["#." parser]
   ["#." pom]
   ["#." cli]
   ["#." cache]
   ["#." repository (#+ Address)]
   ["#." dependency #_
    ["#" resolution]]
   ["#." command (#+ Command)
    ["#/." clean]
    ["#/." pom]
    ["#/." install]
    ["#/." deps]
    ["#/." build]
    ["#/." test]
    ["#/." auto]
    ["#/." deploy]]])

(def: (with-dependencies command profile)
  (All [a] (-> (Command a) (Command a)))
  (do /action.monad
    [_ (/command/deps.do! profile)]
    (command profile)))

(exception: (cannot-find-repository {repository Text}
                                    {options (Dictionary Text Address)})
  (exception.report
   ["Repository" (%.text repository)]
   ["Options" (exception.enumerate (function (_ [name repo])
                                     (format (%.text name) " := " (%.text repo)))
                                   (dictionary.entries options))]))

(program: [{[profile operation] /cli.command}]
  (do {! io.monad}
    [?profile (/input.read io.monad file.default profile)]
    (case ?profile
      (#try.Success profile)
      (case operation
        #/cli.Clean
        (exec (/command/clean.do! (file.async file.default) profile)
          (wrap []))

        #/cli.POM
        (exec (/command/pom.do! (file.async file.default) profile)
          (wrap []))
        
        #/cli.Install
        (exec (/command/install.do! (file.async file.default) profile)
          (wrap []))

        (#/cli.Deploy repository identity)
        (exec (case [(get@ #/.identity profile)
                     (dictionary.get repository (get@ #/.deploy-repositories profile))]
                [(#.Some artifact) (#.Some repository)]
                (/command/deploy.do! (/repository.async (/repository.remote repository))
                                     (file.async file.default)
                                     identity
                                     artifact
                                     profile)

                [#.None _]
                (promise@wrap (exception.throw /.no-identity []))

                [_ #.None]
                (promise@wrap (exception.throw ..cannot-find-repository [repository (get@ #/.deploy-repositories profile)])))
          (wrap []))
        
        #/cli.Dependencies
        (exec (/command/deps.do! profile)
          (wrap []))

        (#/cli.Compilation compilation)
        (case compilation
          #/cli.Build (exec (..with-dependencies /command/build.do! profile)
                        (wrap []))
          #/cli.Test (exec (..with-dependencies /command/test.do! profile)
                       (wrap [])))

        (#/cli.Auto auto)
        (exec (case auto
                #/cli.Build (..with-dependencies (/command/auto.do! /command/build.do!) profile)
                #/cli.Test (..with-dependencies (/command/auto.do! /command/test.do!) profile))
          (wrap [])))
      
      (#try.Failure error)
      (wrap (log! error)))))