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

(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: [project-file]
  (do {@ io.monad}
    [data (..read-file! project-file)]
    (case data
      (#try.Success data)
      (case (..project data)
        (#try.Success value)
        (do @
          [outcome (..write-pom! /pom.file value)]
          (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)))))
        
        (#try.Failure error)
        (wrap (log! (format "Invalid format file:" text.new-line
                            error))))
      
      (#try.Failure error)
      (wrap (log! (format "Could not read file: "
                          (%.text project-file)))))))