module Web.Hastodon.Util
( HastodonClient(..)
, mkHastodonHeader
, mkHastodonRequestWithQuery
, mkHastodonRequest
, mkOption
, mkArrayOption
, optionMempty
, optionMappend
, optionAsQuery
, optionAsForm
, utf8ToChar8
) where
import Data.Maybe (fromMaybe)
import qualified Data.ByteString.Char8 as Char8
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Map as Map
import Network.HTTP.Simple
import Network.HTTP.Types.Header
import Web.Hastodon.Types
data HastodonClient = HastodonClient {
host :: String,
token :: String
}
mkHastodonRequestWithQuery ::
[(Char8.ByteString, Maybe Char8.ByteString)] -> String -> HastodonClient -> IO Request
mkHastodonRequestWithQuery opt path client = do
initReq <- parseRequest $ "https://" ++ (host client) ++ path
return $
mkHastodonHeader (token client) $
setRequestQueryString opt $ initReq
mkHastodonRequest :: String -> HastodonClient -> IO Request
mkHastodonRequest = mkHastodonRequestWithQuery []
mkHastodonHeader :: String -> Request -> Request
mkHastodonHeader token =
addRequestHeader hAuthorization $ utf8ToChar8 $ "Bearer " ++ token
utf8ToChar8 :: String -> Char8.ByteString
utf8ToChar8 = T.encodeUtf8 . T.pack
mkOption :: IsOption a => String -> Maybe String -> a
mkOption key val = fromOptionImpl $ Map.singleton (utf8ToChar8 key) (Right $ utf8ToChar8 <$> val)
mkArrayOption :: IsOption a => String -> [String] -> a
mkArrayOption key val = fromOptionImpl $ Map.singleton (utf8ToChar8 key) (Left $ utf8ToChar8 <$> val)
optionMempty :: IsOption a => a
optionMempty = fromOptionImpl Map.empty
optionMappend :: IsOption a => a -> a -> a
optionMappend x y = fromOptionImpl $ Map.union (toOptionImpl x) (toOptionImpl y)
optionAsQuery :: IsOption a => a -> [(Char8.ByteString, Maybe Char8.ByteString)]
optionAsQuery x = do
(k, v) <- Map.toList $ toOptionImpl x
let k' = k `mappend` Char8.pack "[]"
case v of
Left l -> [(k, Just x) | x <- l]
Right r -> [(k, r)]
optionAsForm :: IsOption a => a -> [(Char8.ByteString, Char8.ByteString)]
optionAsForm opt = fmap cnv $ optionAsQuery opt
where cnv (x, y) = (x, fromMaybe (Char8.pack "true") y)