packages feed

axel-0.0.13: test/Axel/Test/Eff/ProcessMock.hs

{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TemplateHaskell #-}

module Axel.Test.Eff.ProcessMock where

import Axel.Prelude

import Axel.Eff ((:>>))
import Axel.Eff.FileSystem as Effs
import Axel.Eff.Process as Effs

import Control.Lens

import qualified Effectful as Eff
import qualified Effectful.Dispatch.Dynamic as Eff
import qualified Effectful.Error.Static as Eff
import qualified Effectful.State.Static.Local as Eff

import System.Exit

import TestUtils

newtype ProcessResult effs =
  ProcessResult ((ExitCode, Maybe (Text, Text)), Eff.Eff effs ())

-- | We are pretending that all `ProcessResult`s are unique no matter what, for simplicity's sake.
instance Eq (ProcessResult effs) where
  (==) :: ProcessResult effs -> ProcessResult effs -> Bool
  _ == _ = False

-- | We are pretending that all `ProcessResult`s are unique no matter what, for simplicity's sake.
instance Show (ProcessResult effs) where
  show :: ProcessResult effs -> String
  show _ = "<ProcessResult>"

data ProcessState effs =
  ProcessState
    { _procMockArgs :: [Text]
    , _procExecutionLog :: [(Text, Maybe Text)]
    , _procMockResults :: [ProcessResult effs]
    }
  deriving (Eq, Show)

makeFieldsNoPrefix ''ProcessState

mkProcessState :: [Text] -> [ProcessResult effs] -> ProcessState effs
mkProcessState mockArgs mockResults =
  ProcessState
    { _procMockArgs = mockArgs
    , _procExecutionLog = []
    , _procMockResults = mockResults
    }

runProcess ::
     forall effs a. ('[ Eff.Error Text, Effs.FileSystem] :>> effs)
  => ProcessState effs
  -> Eff.Eff (Effs.Process ': effs) a
  -> Eff.Eff effs (a, ProcessState effs)
runProcess origProcessState =
  Eff.reinterpret (Eff.runState origProcessState) (const go)
  where
    go :: Process m a' -> Eff.Eff (Eff.State (ProcessState effs) ': effs) a'
    go (CreateIndependentProcess _) =
      throwInterpretError
        @(ProcessState effs)
        "CreateIndependentProcess"
        "Not implemented!"
    go (CreatePassthroughProcess _) =
      throwInterpretError
        @(ProcessState effs)
        "CreatePassthroughProcess"
        "Not implemented!"
    go GetArgs = Eff.gets (^. procMockArgs)
    go (HandleGetContents _) =
      throwInterpretError
        @(ProcessState effs)
        "HandleGetContents"
        "Not implemented!"
    go (HandleGetLine _) =
      throwInterpretError
        @(ProcessState effs)
        "HandleGetLine"
        "Not implemented!"
    go (HandleIsAtEnd _) =
      throwInterpretError
        @(ProcessState effs)
        "HandleIsAtEnd"
        "Not implemented!"
    go (WaitOnProcess _) =
      throwInterpretError
        @(ProcessState effs)
        "WaitOnProcess"
        "Not implemented!"