module Network.API.Builder.Send.Multipart
  ( sendMultipart
  , Multipart(..) ) where

import Network.API.Builder.Builder
import Network.API.Builder.Routes
import Network.API.Builder.Send

import Control.Monad
import Control.Monad.IO.Class
import Network.HTTP.Client.MultipartFormData
import Network.HTTP.Client (Request)

-- | A type for multipart forms, which uses 'Part's from 'Network.HTTP.Client.MultipartFormData'.
--   Construct it and send it with 'sendMultipart' (not 'send').
data Multipart = Multipart [Part]
  deriving (Show)

-- | Send a 'Multipart' request. This can't use the normal 'send' mechanism since
--   it has to do IO to construct its request.
sendMultipart :: MonadIO m => Builder -> Route -> Multipart -> m (Maybe Request)
sendMultipart b r (Multipart ps) = do
  case send b r () of
    Nothing -> return Nothing
    Just req -> liftM Just $ formDataBody ps req