module Web.Spock.Digestive
( runForm )
where
import Web.Spock.Types
import Control.Applicative
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Parse
import Text.Digestive.Form
import Text.Digestive.Types
import Text.Digestive.View
import Web.Scotty.Trans
import qualified Data.ByteString.Char8 as BS
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
runForm :: T.Text
-> Form v (SpockAction conn sess st) a
-> SpockAction conn sess st (View v, Maybe a)
runForm formName form =
do httpMethod <- requestMethod <$> request
if httpMethod == methodGet
then do f <- getForm formName form
return (f, Nothing)
else postForm formName form (const $ return localEnv)
where
localEnv :: Env (SpockAction conn sess st)
localEnv path =
do let name = TL.fromStrict $ fromPath $ path
applyParam f =
map (f . snd) . filter ((== name) . fst)
vars <- (applyParam (TextInput . TL.toStrict)) <$> params
sentFiles <- (applyParam (FileInput . BS.unpack . fileName)) <$> files
return (vars ++ sentFiles)