1
+ {-# LANGUAGE BangPatterns #-}
1
2
module Telegram.Bot.Simple.Debug where
2
3
3
4
import Control.Monad.Trans (liftIO )
4
5
import Control.Monad.Writer (tell )
5
6
import Data.Aeson (ToJSON )
6
7
import qualified Data.Aeson.Encode.Pretty as Aeson
7
- import qualified Data.ByteString.Lazy.Char8 as BSL8
8
8
import Data.Monoid ((<>) )
9
+ import qualified Data.Text.Lazy as Text
10
+ import qualified Data.Text.Lazy.Encoding as Text
9
11
import Debug.Trace (trace )
10
12
11
13
import qualified Telegram.Bot.API as Telegram
12
14
import Telegram.Bot.Simple.BotApp
13
15
import Telegram.Bot.Simple.Eff
14
16
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
16
34
17
35
-- | Trace (debug print) every 'Telegram.Update' before parsing it.
18
36
traceTelegramUpdatesWith
19
37
:: (Telegram. Update -> String ) -- ^ How to display an update.
20
38
-> BotApp model action
21
39
-> BotApp model action
22
40
traceTelegramUpdatesWith f botApp = botApp
23
- { botAction = \ update -> botAction botApp ( trace (f update) update)
41
+ { botAction = \ update -> botAction botApp $! trace (f update) update
24
42
}
25
43
26
44
-- | Trace (debug print) every update as pretty JSON value.
27
45
traceTelegramUpdatesJSON :: BotApp model action -> BotApp model action
28
- traceTelegramUpdatesJSON = traceTelegramUpdatesWith prettyJSONString
46
+ traceTelegramUpdatesJSON = traceTelegramUpdatesWith ppAsJSON
29
47
30
48
-- | Trace (debug print) every update using 'Show' instance.
31
49
traceTelegramUpdatesShow :: BotApp model action -> BotApp model action
32
50
traceTelegramUpdatesShow = traceTelegramUpdatesWith show
33
51
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
35
64
36
65
-- | Trace (debug print) every incoming and issued action.
37
66
traceBotActionsWith
38
- :: (action -> String ) -- ^ How to display an action.
67
+ :: (TracedAction action -> String ) -- ^ How to display an action.
39
68
-> BotApp model action
40
69
-> BotApp model action
41
- traceBotActionsWith f botApp = botApp { botHandler = newBotHandler }
70
+ traceBotActionsWith f botApp = botApp { botHandler = newHandler }
42
71
where
43
72
traceAction action = action <$ do
44
- liftIO $ putStrLn (" Issued action: " <> f action)
73
+ liftIO $ putStrLn (f ( TracedIssuedAction action) )
45
74
46
- newBotHandler action model = do
75
+ newHandler ! action model = do
47
76
Eff (tell (map (>>= traceAction) actions))
48
77
pure newModel
49
78
where
50
79
(newModel, actions) = runEff $
51
80
botHandler botApp
52
- (trace (" Incoming action: " <> f action) action)
81
+ (trace (f ( TracedIncomingAction action) ) action)
53
82
model
54
83
55
84
-- | Trace (debug print) bot actions using 'Show' instance.
56
85
traceBotActionsShow
57
86
:: Show action => BotApp model action -> BotApp model action
58
- traceBotActionsShow = traceBotActionsWith show
87
+ traceBotActionsShow = traceBotActionsWith ppTracedAction
59
88
60
- -- * Trace bot state model
89
+ -- ** Trace bot state model
61
90
62
91
-- | Trace (debug print) bot model.
63
92
traceBotModelWith
@@ -81,9 +110,10 @@ traceBotModelShow = traceBotModelWith show
81
110
-- | Trace (debug print) bot model using 'Show' instance.
82
111
traceBotModelJSON
83
112
:: ToJSON model => BotApp model action -> BotApp model action
84
- traceBotModelJSON = traceBotModelWith prettyJSONString
113
+ traceBotModelJSON = traceBotModelWith ppAsJSON
85
114
86
115
-- * Helpers
87
116
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