packages feed

tricorder-0.7.0.0: src/Tricorder/CLI/App/Daemon.hs

module Tricorder.CLI.App.Daemon (run) where

import Atelier.Effects.Console (Console)
import Atelier.Effects.Delay (Delay)
import Atelier.Effects.File (File)
import Atelier.Effects.Input (Input, input)
import Atelier.Effects.Posix.Daemons (Daemons)
import Atelier.Effects.Timeout (Timeout)
import Effectful (IOE)
import Effectful.Reader.Static (Reader)
import Tricorder.API.Daemon.Command (Command (..))
import Prelude hiding (force)

import Atelier.Effects.Console qualified as Console
import Data.Text qualified as T

import Tricorder.CLI.Daemon (restartDaemon, startDaemon, stopDaemon, waitForDaemon)
import Tricorder.CLI.Operations (showDaemonInfo)
import Tricorder.Daemon.DaemonInfo (DaemonInfo)
import Tricorder.Runtime (PidFile (..), SocketPath (..))
import Tricorder.Socket.Client (isDaemonRunning)
import Tricorder.Socket.UnixSocket (UnixSocket)


run
    :: ( Console :> es
       , Daemons :> es
       , Delay :> es
       , File :> es
       , IOE :> es
       , Input DaemonInfo :> es
       , Reader PidFile :> es
       , Reader SocketPath :> es
       , Timeout :> es
       , UnixSocket :> es
       )
    => Command -> Eff es ()
run = \case
    Start -> do
        running <- isDaemonRunning
        if running
            then
                Console.putStrLn "Daemon already running."
            else do
                startDaemon
                ready <- waitForDaemon
                if ready
                    then
                        Console.putStrLn "Daemon started."
                    else
                        Console.putStrLn "Daemon started, but the socket is not responding yet."
    Stop force -> do
        running <- isDaemonRunning
        when running
            $ stopDaemon force >>= \case
                Left reasons ->
                    Console.putTextLn
                        $ T.intercalate "\n"
                        $ "Was unable to stop the daemon:" : reasons
                Right result -> do
                    Console.putTextLn result
    Restart force ->
        restartDaemon force >>= \case
            Just (Left reasons) -> traverse_ Console.putTextLn reasons
            _ -> pass
    Info format -> do
        daemonInfo <- input
        showDaemonInfo format daemonInfo