telega-0.1.0: Network/Telegram/API/Bot/Capacity/Editable.hs
module Network.Telegram.API.Bot.Capacity.Editable (Editable (..), Substitution) where
import "aeson" Data.Aeson (FromJSON, Value, decode)
import "base" Control.Exception (try)
import "base" Control.Monad (join)
import "base" Data.Maybe (fromJust)
import "http-client" Network.HTTP.Client (Response (responseBody))
import "text" Data.Text (unpack)
import "transformers" Control.Monad.Trans.Class (lift)
import "transformers" Control.Monad.Trans.Except (ExceptT (ExceptT))
import "transformers" Control.Monad.Trans.Reader (ask)
import qualified "wreq" Network.Wreq.Session as Wreq (post)
import Network.Telegram.API.Bot.Core (Telegram, Token (Token), Ok, result)
type family Substitution a = r | r -> a
class FromJSON a => Editable a where
{-# MINIMAL substitution_value, edit_endpoint #-}
substitution_value :: Substitution a -> Value
edit_endpoint :: Substitution a -> String
edit :: Substitution a -> Telegram e a
edit x = snd <$> ask >>= \(session, Token token) -> lift . ExceptT . try
. fmap (fromJust . join . fmap result . decode @(Ok a) . responseBody)
. flip (Wreq.post session) (substitution_value x) $
"https://api.telegram.org/" <> unpack token <> "/" <> edit_endpoint x