packages feed

ribosome-app-0.9.9.9: lib/Ribosome/App/Cli.hs

module Ribosome.App.Cli where

import Polysemy.Chronos (ChronosTime, interpretTimeChronos)
import System.Exit (exitFailure)
import System.IO (stderr)

import Ribosome.App.Boot (generateBoot)
import Ribosome.App.Data (Global (Global))
import Ribosome.App.Error (RainbowError, runRainbowErrorAnd)
import Ribosome.App.NewOptions (newOptions)
import Ribosome.App.NewProject (newProject)
import Ribosome.App.Options (Command (Boot, New), GlobalOptions (GlobalOptions), Options (..), parseCli)
import Ribosome.App.ProjectOptions (projectOptions)

runCommand ::
  Members [ChronosTime, Stop RainbowError, Embed IO] r =>
  Global ->
  Command ->
  Sem r ()
runCommand global = \case
  New opts -> do
    conf <- newOptions opts
    newProject global conf
  Boot opts -> do
    conf <- projectOptions False opts
    generateBoot global conf

runOptions ::
  Members [ChronosTime, Stop RainbowError, Embed IO] r =>
  Options ->
  Sem r ()
runOptions (Options (GlobalOptions quiet force) cmd) =
  runCommand (Global (fromMaybe False quiet) (fromMaybe False force)) cmd

main :: IO ()
main = do
  conf <- parseCli
  runConc $ interpretTimeChronos (runRainbowErrorAnd stderr (embed exitFailure) (runOptions conf))