1+ {-# LANGUAGE BangPatterns #-}
12module Telegram.Bot.Simple.Debug where
23
34import Control.Monad.Trans (liftIO )
45import Control.Monad.Writer (tell )
56import Data.Aeson (ToJSON )
67import qualified Data.Aeson.Encode.Pretty as Aeson
7- import qualified Data.ByteString.Lazy.Char8 as BSL8
88import Data.Monoid ((<>) )
9+ import qualified Data.Text.Lazy as Text
10+ import qualified Data.Text.Lazy.Encoding as Text
911import Debug.Trace (trace )
1012
1113import qualified Telegram.Bot.API as Telegram
1214import Telegram.Bot.Simple.BotApp
1315import Telegram.Bot.Simple.Eff
1416
15- -- * Trace 'Telegram.Update's
17+ -- * Bot debug tracing
18+
19+ -- | This a default bot tracing modifier that relies on
20+ --
21+ -- * 'traceTelegramUpdatesJSON'
22+ -- * 'traceBotActionsShow'
23+ -- * 'traceBotModelShow'
24+ traceBotDefault
25+ :: (Show model , Show action )
26+ => BotApp model action
27+ -> BotApp model action
28+ traceBotDefault
29+ = traceTelegramUpdatesJSON
30+ . traceBotActionsShow
31+ . traceBotModelShow
32+
33+ -- ** Trace 'Telegram.Update's
1634
1735-- | Trace (debug print) every 'Telegram.Update' before parsing it.
1836traceTelegramUpdatesWith
1937 :: (Telegram. Update -> String ) -- ^ How to display an update.
2038 -> BotApp model action
2139 -> BotApp model action
2240traceTelegramUpdatesWith f botApp = botApp
23- { botAction = \ update -> botAction botApp ( trace (f update) update)
41+ { botAction = \ update -> botAction botApp $! trace (f update) update
2442 }
2543
2644-- | Trace (debug print) every update as pretty JSON value.
2745traceTelegramUpdatesJSON :: BotApp model action -> BotApp model action
28- traceTelegramUpdatesJSON = traceTelegramUpdatesWith prettyJSONString
46+ traceTelegramUpdatesJSON = traceTelegramUpdatesWith ppAsJSON
2947
3048-- | Trace (debug print) every update using 'Show' instance.
3149traceTelegramUpdatesShow :: BotApp model action -> BotApp model action
3250traceTelegramUpdatesShow = traceTelegramUpdatesWith show
3351
34- -- * Trace bot actions
52+ -- ** Trace bot actions
53+
54+ -- | A type of an action to trace.
55+ data TracedAction action
56+ = TracedIncomingAction action -- ^ An action that's about to be handled.
57+ | TracedIssuedAction action -- ^ An action that's just been issued by some handler.
58+ deriving (Eq , Show )
59+
60+ -- | Pretty print 'TraceActionType'.
61+ ppTracedAction :: Show action => TracedAction action -> String
62+ ppTracedAction (TracedIncomingAction action) = " Incoming: " <> show action
63+ ppTracedAction (TracedIssuedAction action) = " Issued: " <> show action
3564
3665-- | Trace (debug print) every incoming and issued action.
3766traceBotActionsWith
38- :: (action -> String ) -- ^ How to display an action.
67+ :: (TracedAction action -> String ) -- ^ How to display an action.
3968 -> BotApp model action
4069 -> BotApp model action
41- traceBotActionsWith f botApp = botApp { botHandler = newBotHandler }
70+ traceBotActionsWith f botApp = botApp { botHandler = newHandler }
4271 where
4372 traceAction action = action <$ do
44- liftIO $ putStrLn (" Issued action: " <> f action)
73+ liftIO $ putStrLn (f ( TracedIssuedAction action) )
4574
46- newBotHandler action model = do
75+ newHandler ! action model = do
4776 Eff (tell (map (>>= traceAction) actions))
4877 pure newModel
4978 where
5079 (newModel, actions) = runEff $
5180 botHandler botApp
52- (trace (" Incoming action: " <> f action) action)
81+ (trace (f ( TracedIncomingAction action) ) action)
5382 model
5483
5584-- | Trace (debug print) bot actions using 'Show' instance.
5685traceBotActionsShow
5786 :: Show action => BotApp model action -> BotApp model action
58- traceBotActionsShow = traceBotActionsWith show
87+ traceBotActionsShow = traceBotActionsWith ppTracedAction
5988
60- -- * Trace bot state model
89+ -- ** Trace bot state model
6190
6291-- | Trace (debug print) bot model.
6392traceBotModelWith
@@ -81,9 +110,10 @@ traceBotModelShow = traceBotModelWith show
81110-- | Trace (debug print) bot model using 'Show' instance.
82111traceBotModelJSON
83112 :: ToJSON model => BotApp model action -> BotApp model action
84- traceBotModelJSON = traceBotModelWith prettyJSONString
113+ traceBotModelJSON = traceBotModelWith ppAsJSON
85114
86115-- * Helpers
87116
88- prettyJSONString :: ToJSON a => a -> String
89- prettyJSONString = BSL8. unpack . Aeson. encodePretty
117+ -- | Pretty print a value as JSON.
118+ ppAsJSON :: ToJSON a => a -> String
119+ ppAsJSON = Text. unpack . Text. decodeUtf8 . Aeson. encodePretty
0 commit comments