{-# LANGUAGE OverloadedStrings #-}

{-|

Miscellaneous functions for Snap.

-}

module Snap.Snaplet.Redson.Util where

import Control.Applicative

import Data.Char (isDigit)

import Data.ByteString (ByteString)
import qualified Data.ByteString.UTF8 as BU (toString)

import Data.Maybe

import Snap.Core

------------------------------------------------------------------------------
-- | Get parameter value from Request or return empty string
fromParam :: MonadSnap m => ByteString -> m ByteString
fromParam p = fromMaybe "" <$> getParam p


------------------------------------------------------------------------------
-- | Get integer parameter value from Request or return default value.
fromIntParam :: MonadSnap m => ByteString -> Int -> m Int
fromIntParam p def = do
  i <- getParam p
  return $ case i of
      Just b -> let
          s = BU.toString b
          in
            if (all isDigit s) then (read s)
            else def
      _ -> def


data Error = Error { code :: Int
                   -- ^ Error response code
                   }


------------------------------------------------------------------------------
-- | Short-circuit MonadSnap flow with error response
handleError :: MonadSnap m => Error -> m ()
handleError err = do
    modifyResponse $ setResponseCode (code err)
    r <- getResponse
    finishWith r


notFound :: Error
notFound = Error 404

serverError :: Error
serverError = Error 500

unauthorized :: Error
unauthorized = Error 401

forbidden :: Error
forbidden = Error 403