packages feed

tricorder-0.7.0.0: src/Tricorder/CLI/UI/State.hs

module Tricorder.CLI.UI.State
    ( Viewports (..)
    , State (..)
    , Processed (..)
    , init
    , currentRoute
    , viewToViewport
    , cycleTestFilter
    , navigate
    )
where

import Atelier.Effects.Clock (Clock, TimeZone)
import Tricorder.API.TestFilter (TestFilter)
import Prelude hiding (init)

import Atelier.Effects.Clock qualified as Clock
import Tricorder.API.TestFilter qualified as TestFilter

import Tricorder.Build (BuildState)
import Tricorder.CLI.UI.Route (Route)

import Tricorder.CLI.UI.Route qualified as Route


data Viewports
    = MainViewport
    | DiagnosticViewport
    | TestViewport
    | EvalResultsViewport
    deriving stock (Eq, Ord, Show)


data State = State
    { buildState :: Processed Text BuildState
    , timeZone :: TimeZone
    , route :: Route
    , testFilter :: TestFilter
    , showHelp :: Bool
    }


cycleTestFilter :: TestFilter -> TestFilter
cycleTestFilter x = if x == maxBound then minBound else succ x


data Processed e a
    = Waiting
    | Failure e
    | Success a


currentRoute :: State -> Route
currentRoute = (.route)


viewToViewport :: Route -> Maybe Viewports
viewToViewport = \case
    Route.Tests -> Just TestViewport
    Route.Main -> Just DiagnosticViewport
    _ -> Nothing


navigate :: Route -> State -> State
navigate route s = s {route}


init :: (Clock :> es) => Eff es State
init = do
    tz <- Clock.currentTimeZone
    pure
        State
            { buildState = Waiting
            , timeZone = tz
            , route = Route.Main
            , testFilter = TestFilter.All
            , showHelp = False
            }