packages feed

yesod-dsl-0.2.0: codegen/filter-sort.cg

{-# LANGUAGE FlexibleInstances #-}

module Handler.~{moduleName m}.FilterSort where
import qualified Handler.~{moduleName m}.PathPieces as PP
import Prelude
import Data.Text (Text)
import Data.Maybe
import Data.Aeson
import Data.Aeson.TH
import Data.String
import Control.Monad
import Control.Applicative
import qualified Data.List as L
import qualified Data.Text as T
import qualified Data.Aeson.Types as AT
import qualified Data.HashMap.Strict as HMS

data Filter = Filter {
    f_type :: Text,
    f_value :: Maybe Text,
    f_field :: Maybe Text,
    f_comparison :: Text,
    f_negate :: Bool,
    f_exprs :: [Filter]
} 

instance FromJSON Filter where
    parseJSON (Object v) = Filter 
        <$> v .:? "type" .!= "string" 
        <*> (parseStringOrInt v) 
        <*> (v .: "field" <|>  v .: "property")
        <*> v .:? "comparison" .!= "eq" 
        <*> v .:? "negate" .!= False
        <*> v .:? "exprs" .!= []
    parseJSON _ = mzero

instance IsString (Maybe Text) where
    fromString "" = Nothing
    fromString a  = Just $ T.pack a

parseStringOrInt :: HMS.HashMap Text Value -> AT.Parser (Maybe Text)
parseStringOrInt hm = case HMS.lookup "value" hm of
    Just (Number n) -> return $ Just $ T.pack $ show n
    Just (String s) -> return $ Just s 
    Just (Null) -> return Nothing
    _ -> mzero

data Sort = Sort {
    s_field :: Text,
    s_direction :: Text
}
instance FromJSON Sort where
    parseJSON (Object v) = Sort 
        <$> (v .: "field" <|> v .: "property")
        <*> (v .: "direction")
        
    parseJSON _ = mzero


getDefaultFilter maybeGetParam defaultFilter p = do
    f <- maybe maybeGetParam id getFilter
    PP.fromPathPiece f
    where 
        getFilter = do            
            j <- defaultFilter
            v <- L.find (\fjm -> f_field fjm == p) j
            return (f_value v)
hasDefaultFilter maybeGetParam defaultFilter p = isJust $
    maybe maybeGetParam id getFilter
    where
        getFilter = do
            j <- defaultFilter
            v <- L.find (\fjm -> f_field fjm == p) j
            return (f_value v)