(.module: [lux (#- Name) [abstract [monad (#+ do)]] [control [pipe (#+ do>)] ["." io (#+ IO)] ["." try (#+ Try) ("#\." functor)] ["." exception (#+ exception:)] [parser [environment (#+ Environment)] [cli (#+ program:)]] [security ["!" capability]] [concurrency ["." promise (#+ Promise) ("#\." monad)]]] [data [binary (#+ Binary)] ["." text ["%" format (#+ format)] ["." encoding]] [format ["." xml]] [collection ["." set] ["." dictionary (#+ Dictionary)] ["." list ("#\." functor)]]] [tool [compiler [language [lux ["." syntax]]]]] [world ["." shell (#+ Shell)] ["." console (#+ Console)] ["." program (#+ Program)] ["." file (#+ Path) ["." watch]]]] ["." / #_ ["#" profile] ["#." action (#+ Action)] ["#." project (#+ Project)] ["#." input] ["#." parser] ["#." pom] ["#." cli] ["#." cache] ["#." repository (#+ Address Repository)] ["#." dependency #_ ["#" resolution (#+ Resolution)]] ["#." command (#+ Command) ["#/." version] ["#/." clean] ["#/." pom] ["#/." install] ["#/." deps] ["#/." build] ["#/." test] ["#/." auto] ["#/." deploy]]]) (def: repositories (-> /.Profile (List (Repository Promise))) (|>> (get@ #/.repositories) set.to-list (list\map (|>> /repository.remote /repository.async)))) (def: (with-dependencies console command profile) (All [a] (-> (Console Promise) (-> (Console Promise) (Program Promise) (file.System Promise) (Shell Promise) Resolution (Command a)) (Command a))) (do /action.monad [resolution (/command/deps.do! console (file.async file.default) (..repositories profile) profile)] ((command console (program.async program.default) (file.async file.default) (shell.async shell.default) resolution) 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))])) (def: (command action) (All [a] (-> (Promise (Try a)) (IO Any))) (exec (do promise.monad [outcome action #let [code (case outcome (#try.Failure error) (exec (log! error) shell.normal) (#try.Success _) shell.error)]] (promise.future (\ program.default exit code))) (\ io.monad wrap []))) (program: [{[profile operation] /cli.command}] (do {! io.monad} [?console console.default] (case (try\map console.async ?console) (#try.Failure error) (wrap (log! error)) (#try.Success console) (case operation #/cli.Version (..command (/command/version.do! console (\ /.monoid identity))) _ (do ! [?profile (/input.read io.monad file.default profile)] (case ?profile (#try.Failure error) (exec (log! error) (\ program.default exit shell.error)) (#try.Success profile) (case operation #/cli.Version (wrap []) #/cli.Clean (..command (/command/clean.do! console (file.async file.default) profile)) #/cli.POM (..command (/command/pom.do! console (file.async file.default) profile)) #/cli.Install (..command (/command/install.do! console (file.async file.default) profile)) (#/cli.Deploy repository identity) (..command (case [(get@ #/.identity profile) (dictionary.get repository (get@ #/.deploy-repositories profile))] [(#.Some artifact) (#.Some repository)] (/command/deploy.do! console (/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)])))) #/cli.Dependencies (..command (/command/deps.do! console (file.async file.default) (..repositories profile) profile)) (#/cli.Compilation compilation) (case compilation #/cli.Build (..command (..with-dependencies console /command/build.do! profile)) #/cli.Test (..command (..with-dependencies console /command/test.do! profile))) (#/cli.Auto auto) (do ! [?watcher watch.default] (case ?watcher (#try.Failure error) (wrap (log! error)) (#try.Success watcher) (..command (case auto #/cli.Build (..with-dependencies console (/command/auto.do! watcher /command/build.do!) profile) #/cli.Test (..with-dependencies console (/command/auto.do! watcher /command/test.do!) profile)))))) ))))))