(.module: [lux #* [type (#+ :share)] [cli (#+ program:)] ["." io (#+ IO io)] [control [monad (#+ do)]] [data ["." error (#+ Error)] ["." text format]] [time ["." instant (#+ Instant)]] [world ["." console]] [tool [compiler ["." statement] [phase [macro (#+ Expander)] ["." generation]] [default ["." platform (#+ Platform)] ["." syntax]] [meta ["." archive (#+ Archive)]]] ## ["." interpreter] ]] [/ ["." cli (#+ Service)]]) (def: (or-crash! failure-description action) (All [a] (-> Text (IO (Error a)) (IO a))) (do io.monad [?output action] (case ?output (#error.Failure error) (exec (log! (format text.new-line failure-description text.new-line error text.new-line)) (io.exit +1)) (#error.Success output) (wrap output)))) (def: #export (compiler expander platform bundle program service) (All [anchor expression statement] (-> Expander (IO (Platform IO anchor expression statement)) (generation.Bundle anchor expression statement) (-> expression statement) Service (IO Any))) (do io.monad [platform platform console (:: @ map error.assume console.system)] (case service (#cli.Compilation configuration) (<| (or-crash! "Compilation failed:") (do (error.with io.monad) [state (:share [anchor expression statement] {(Platform IO anchor expression statement) platform} {(IO (Error (statement.State+ anchor expression statement))) (platform.initialize expander platform bundle program)}) _ (:share [anchor expression statement] {(Platform IO anchor expression statement) platform} {(IO (Error [Archive (statement.State+ anchor expression statement)])) (platform.compile expander platform configuration archive.empty state)}) ## _ (cache/io.clean target ...) ] (wrap (log! "Compilation complete!")))) (#cli.Interpretation configuration) ## TODO: Fix the interpreter... (undefined) ## (<| (or-crash! "Interpretation failed:") ## (interpreter.run (error.with io.monad) console platform configuration bundle)) )))