module HTTP.Form.Data
  ( FormData(..)
  ) where

import Control.Applicative ((<|>))
import qualified Data.Aeson as JSON
import qualified Data.ByteString as BS
import qualified Data.Map.Strict as Map
import Network.Wai.Parse (FileInfo)

data FormData a = FormData
  { formDataQuery :: Map.Map BS.ByteString (Maybe BS.ByteString)
  , formDataPost :: Map.Map BS.ByteString BS.ByteString
  , formDataJSON :: Maybe JSON.Value
  , formDataFiles :: Map.Map BS.ByteString (FileInfo a)
  }

instance Monoid (FormData a) where
  mempty = FormData mempty mempty Nothing mempty
  mappend (FormData q1 p1 j1 f1) (FormData q2 p2 j2 f2) =
    FormData (mappend q1 q2) (mappend p1 p2) (j1 <|> j2) (mappend f1 f2)