aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program/aedifex.lux
blob: 6909704ddf552b0ced3579caae2ff335adeca13c (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
(.module:
  [lux (#- Name)
   [abstract
    [monad (#+ do)]]
   [control
    [pipe (#+ do>)]
    ["." try (#+ Try)]
    ["." io (#+ IO)]
    [parser
     ["." cli (#+ program:)]
     ["<c>" code]]
    [security
     ["!" capability]]
    [concurrency
     ["." promise]]]
   [data
    [binary (#+ Binary)]
    ["." text
     ["%" format (#+ format)]
     ["." encoding]]
    [format
     ["." xml]]]
   [tool
    [compiler
     [language
      [lux
       ["." syntax]]]]]
   [world
    ["." file (#+ Path)]]]
  ["." / #_
   ["#" project]
   ["#." parser]
   ["#." pom]
   ["#." cli]
   ["#." local]])

(def: (read-file! path)
  (-> Path (IO (Try Binary)))
  (do (try.with io.monad)
    [project-file (!.use (:: file.system file) [path])]
    (!.use (:: project-file content) [])))

(def: (write-pom! path project)
  (-> Path /.Project (IO (Try Any)))
  (do (try.with io.monad)
    [file (!.use (:: file.system file) [path])]
    (|> project
        /pom.project
        (:: xml.codec encode)
        encoding.to-utf8
        (!.use (:: file over-write)))))

(def: (read-code source-code)
  (-> Text (Try Code))
  (let [parse (syntax.parse ""
                            syntax.no-aliases
                            (text.size source-code))
        start (: Source
                 [["" 0 0] 0 source-code])]
    (case (parse start)
      (#.Left [end error])
      (#try.Failure error)
      
      (#.Right [end lux-code])
      (#try.Success lux-code))))

(def: project
  (-> Binary (Try /.Project))
  (|>> (do> try.monad
            [encoding.from-utf8]
            [..read-code]
            [(list) (<c>.run /parser.project)])))

(program: [{command /cli.command}]
  (do {@ io.monad}
    [data (..read-file! /.file)]
    (case data
      (#try.Success data)
      (case (..project data)
        (#try.Success project)
        (case command
          #/cli.POM
          (do @
            [outcome (..write-pom! /pom.file project)]
            (case outcome
              (#try.Success value)
              (wrap (log! "Successfully wrote POM file!"))
              
              (#try.Failure error)
              (wrap (log! (format "Could not write POM file:" text.new-line
                                  error)))))
          
          #/cli.Install
          (exec (do promise.monad
                  [outcome (/local.install (file.async file.system) project)]
                  (wrap (case outcome
                          (#try.Success _)
                          (log! "Successfully installed locally!")
                          
                          (#try.Failure error)
                          (log! (format "Could not install locally:" text.new-line
                                        error)))))
            (wrap [])))
        
        (#try.Failure error)
        (wrap (log! (format "Invalid format file:" text.new-line
                            error))))
      
      (#try.Failure error)
      (wrap (log! (format "Could not read file: "
                          (%.text /.file)))))))