haskell-debug-adapter-0.0.32.0: src/Haskell/Debug/Adapter/State/DebugRun/StackTrace.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Haskell.Debug.Adapter.State.DebugRun.StackTrace where
import Control.Monad.IO.Class
import qualified System.Log.Logger as L
import qualified Text.Read as R
import Control.Monad.Except
import qualified Haskell.DAP as DAP
import Haskell.Debug.Adapter.Type
import Haskell.Debug.Adapter.Constant
import qualified Haskell.Debug.Adapter.Utility as U
import qualified Haskell.Debug.Adapter.GHCi as P
import qualified Haskell.Debug.Adapter.State.Utility as SU
-- |
-- Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.StackTraceRequest where
action _ (StackTraceRequest req) = do
liftIO $ L.debugM _LOG_APP $ "DebugRunState StackTraceRequest called. " ++ show req
app req
-- |
--
app :: DAP.StackTraceRequest -> AppContext (Maybe StateTransit)
app req = flip catchError errHdl $ do
let args = DAP.argumentsStackTraceRequest req
dap = ":dap-stacktrace "
cmd = dap ++ U.showDAP args
dbg = dap ++ show args
P.command cmd
U.debugEV _LOG_APP dbg
P.expectPmpt >>= SU.takeDapResult >>= dapHdl
return Nothing
where
-- |
--
dapHdl :: String -> AppContext ()
dapHdl str = case R.readEither str of
Left err -> errHdl err >> return ()
Right (Left err) -> errHdl err >> return ()
Right (Right body) -> do
resSeq <- U.getIncreasedResponseSequence
let res = DAP.defaultStackTraceResponse {
DAP.seqStackTraceResponse = resSeq
, DAP.request_seqStackTraceResponse = DAP.seqStackTraceRequest req
, DAP.successStackTraceResponse = True
, DAP.bodyStackTraceResponse = body
}
U.addResponse $ StackTraceResponse res
-- |
--
errHdl :: String -> AppContext (Maybe StateTransit)
errHdl msg = do
liftIO $ L.errorM _LOG_APP msg
resSeq <- U.getIncreasedResponseSequence
let res = DAP.defaultStackTraceResponse {
DAP.seqStackTraceResponse = resSeq
, DAP.request_seqStackTraceResponse = DAP.seqStackTraceRequest req
, DAP.successStackTraceResponse = False
, DAP.messageStackTraceResponse = msg
}
U.addResponse $ StackTraceResponse res
return Nothing