Skip to content

Commit 49679d4

Browse files
committed
Improve debug tracing
- Force updates and actions (to trace them even if not used) - Pretty print JSON values through Text.decodeUtf8 for better Unicode
1 parent 8ed2783 commit 49679d4

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

src/Telegram/Bot/Simple/Debug.hs

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,92 @@
1+
{-# LANGUAGE BangPatterns #-}
12
module Telegram.Bot.Simple.Debug where
23

34
import Control.Monad.Trans (liftIO)
45
import Control.Monad.Writer (tell)
56
import Data.Aeson (ToJSON)
67
import qualified Data.Aeson.Encode.Pretty as Aeson
7-
import qualified Data.ByteString.Lazy.Char8 as BSL8
88
import Data.Monoid ((<>))
9+
import qualified Data.Text.Lazy as Text
10+
import qualified Data.Text.Lazy.Encoding as Text
911
import Debug.Trace (trace)
1012

1113
import qualified Telegram.Bot.API as Telegram
1214
import Telegram.Bot.Simple.BotApp
1315
import 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.
1836
traceTelegramUpdatesWith
1937
:: (Telegram.Update -> String) -- ^ How to display an update.
2038
-> BotApp model action
2139
-> BotApp model action
2240
traceTelegramUpdatesWith 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.
2745
traceTelegramUpdatesJSON :: BotApp model action -> BotApp model action
28-
traceTelegramUpdatesJSON = traceTelegramUpdatesWith prettyJSONString
46+
traceTelegramUpdatesJSON = traceTelegramUpdatesWith ppAsJSON
2947

3048
-- | Trace (debug print) every update using 'Show' instance.
3149
traceTelegramUpdatesShow :: BotApp model action -> BotApp model action
3250
traceTelegramUpdatesShow = 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.
3766
traceBotActionsWith
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.
5685
traceBotActionsShow
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.
6392
traceBotModelWith
@@ -81,9 +110,10 @@ traceBotModelShow = traceBotModelWith show
81110
-- | Trace (debug print) bot model using 'Show' instance.
82111
traceBotModelJSON
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

Comments
 (0)