packages feed

lrclib-client-0.3.0: src/LrcLib/HTTP.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}

module LrcLib.HTTP where

import Control.Monad.IO.Class (liftIO)
import Control.Monad.Reader (ask)
import Data.Bifunctor (second)
import Data.ByteString (ByteString)
import Data.ByteString.Lazy qualified as BSL
import Data.Text (Text)
import Data.Text.Encoding (encodeUtf8)
import LrcLib.Types
import Network.HTTP.Client
  ( Request (method, path, queryString, requestBody, requestHeaders),
    RequestBody (RequestBodyLBS),
    Response,
    httpLbs,
  )
import Network.HTTP.Client.TLS (getGlobalManager)
import Network.HTTP.Types (RequestHeaders, renderSimpleQuery)

type ByteStringL = BSL.ByteString

post ::
  ByteString -> RequestHeaders -> ByteStringL -> API (Response ByteStringL)
post subpath requestHeaders body = do
  api <- ask
  let req =
        api
          { method = "POST",
            path = api.path <> subpath,
            requestHeaders,
            requestBody = RequestBodyLBS body
          }
  liftIO do
    man <- getGlobalManager
    httpLbs req man

get :: ByteString -> [(ByteString, Text)] -> API (Response ByteStringL)
get subpath query = do
  api <- ask
  let req =
        api
          { path = api.path <> subpath,
            queryString =
              renderSimpleQuery False $ map (second encodeUtf8) query
          }
  liftIO do
    man <- getGlobalManager
    httpLbs req man