Source

ella / src / Ella / Param.hs

Full commit
Luke Plant c7992ca 
Luke Plant dcc3e82 

Luke Plant c7992ca 
Luke Plant 0f2f443 

Luke Plant c7992ca 



Luke Plant 0f2f443 
Luke Plant c7992ca 


Luke Plant dcc3e82 
Luke Plant c7992ca 




Luke Plant be51d8f 





Luke Plant c7992ca 



Luke Plant 989ac7d 


Luke Plant c7992ca 

Luke Plant 0f2f443 














{-# OPTIONS_GHC -XTypeSynonymInstances #-}
-- | Type class and utilities used for making it easy to capture
-- parameters from URLs and parse GET/POST values as specific types.
module Ella.Param ( Param(..)
                  , parseOrDefault
                  , captureOrDefault
                  )

where

import Maybe (fromMaybe)
import Ella.GenUtils (exactParse)

-- | Type class representing parameters that can be captured (usually
-- from URL components)
class Param a where
    -- | Convert a string to a value, returning Nothing if not possible
    capture :: String -> Maybe a

instance Param Int where
    -- Bug in reads for Int - it seems to ignore overflow and just
    -- return whatever value.  We can only check by converting back
    -- to a string and checking.
    capture s = exactParse s >>= \i -> if show i == s
                                       then Just i
                                       else Nothing

instance Param Integer where
    capture = exactParse

instance Param Bool where
    capture = exactParse

instance Param String where
    capture = Just

-- | Parse a value (packed in a Just) or return a default
--
-- This is useful in dealing with 'Maybe' vals returned from getGET,
-- getPOST etc.  It can be used with any types that are instances of Read.
-- Note that 'Read' for Strings expects quotes and escaping, so this
-- in general is not useful for String values.
parseOrDefault :: (Read a) => Maybe String -> a -> a
parseOrDefault v d = fromMaybe d (v >>= exactParse)

-- | Parse a value (packed in a Just) or return a default
--
-- This is useful in dealing with 'Maybe' vals returned from getGET,
-- getPOST etc.  It can be used with any types that are instances of Param.
captureOrDefault :: (Param a) => Maybe String -> a -> a
captureOrDefault v d = fromMaybe d (v >>= capture)