(.module: [lux (#- Name) [abstract [monad (#+ do)]] [control [pipe (#+ do>)] ["." try (#+ Try)] ["." io (#+ IO)] [parser ["." cli (#+ program:)] ["" code]] [security ["!" capability]] [concurrency ["." promise (#+ Promise)]]] [data [binary (#+ Binary)] ["." text ["%" format (#+ format)] ["." encoding]] [format ["." xml]]] [tool [compiler [language [lux ["." syntax]]]]] [world ["." file (#+ Path)]]] ["." / #_ ["#" project] ["#." parser] ["#." pom] ["#." cli] ["#." local] ["#." dependency]]) (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: (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: (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: (write-pom! project) (-> /.Project (IO Any)) (do io.monad [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)))))) (def: (install! project) (-> /.Project (Promise Any)) (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)))))) (def: (fetch-dependencies! project) (-> /.Project (Promise Any)) (do promise.monad [outcome (do (try.with promise.monad) [cache (/local.all-cached (file.async file.system) (get@ #/.dependencies project) /dependency.empty) resolution (promise.future (/dependency.resolve-all (get@ #/.repositories project) (get@ #/.dependencies project) cache))] (/local.cache-all (file.async file.system) resolution))] (wrap (case outcome (#try.Success _) (log! "Successfully resolved dependencies!") (#try.Failure error) (log! (format "Could not resolve dependencies:" text.new-line error)))))) (def: project (-> Binary (Try /.Project)) (|>> (do> try.monad [encoding.from-utf8] [..read-code] [(list) (.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 (..write-pom! project) #/cli.Install (exec (..install! project) (wrap [])) #/cli.Dependencies (exec (..fetch-dependencies! project) (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)))))))