1
1
mirror of https://github.com/anoma/juvix.git synced 2024-11-09 22:11:27 +03:00
juvix/app/App.hs

44 lines
1.3 KiB
Haskell
Raw Normal View History

module App where
import GlobalOptions
import MiniJuvix.Pipeline
import MiniJuvix.Prelude hiding (Doc)
import MiniJuvix.Prelude.Error qualified as Error
import MiniJuvix.Prelude.Pretty hiding (Doc)
import System.Console.ANSI qualified as Ansi
data App m a where
ExitError :: MiniJuvixError -> App m a
Say :: Text -> App m ()
RenderStdOut :: (HasAnsiBackend a, HasTextBackend a) => a -> App m ()
RunPipelineEither :: Sem PipelineEff a -> App m (Either MiniJuvixError a)
ReadGlobalOptions :: App m GlobalOptions
makeSem ''App
runAppIO :: forall r a. Member (Embed IO) r => GlobalOptions -> Sem (App ': r) a -> Sem r a
runAppIO g = interpret $ \case
RenderStdOut t
| g ^. globalOnlyErrors -> return ()
| otherwise -> embed $ do
sup <- Ansi.hSupportsANSI stdout
renderIO (not (g ^. globalNoColors) && sup) t
ReadGlobalOptions -> return g
RunPipelineEither p -> embed (runIOEither p)
Say t
| g ^. globalOnlyErrors -> return ()
| otherwise -> embed (putStrLn t)
ExitError e -> do
(embed . hPutStrLn stderr . Error.render (not (g ^. globalNoColors))) e
embed exitFailure
runPipeline :: Member App r => Sem PipelineEff a -> Sem r a
runPipeline p = do
r <- runPipelineEither p
case r of
Left err -> exitError err
Right res -> return res
newline :: Member App r => Sem r ()
newline = say ""