factual-api-0.6.0: Data/Factual/Write/Flag.hs
-- | This module exports the types used to create flag writes.
module Data.Factual.Write.Flag
(
-- * Flag type
Flag(..)
-- * Problem type
, Problem(..)
-- * Required modules
, module Data.Factual.Shared.Table
) where
import Data.Factual.Write
import Data.Factual.Shared.Table
import Data.Maybe (fromJust)
import Data.List.Utils (join)
import Data.Factual.Utils
import qualified Data.Map as M
-- | A Problem represents what is wrong with the row being flagged
data Problem = Duplicate
| Nonexistent
| Inaccurate
| Inappropriate
| Spam
| Other
deriving (Eq, Show)
-- | The Flag type represents a Write to be made to the API which flags a
-- row as having some kind of problem. The table and factualId identify the
-- problematic row, while the problem indicates the type of issue the row
-- has. The user is specified as a string. Other fields such as comment and
-- reference are optional. The debug flag is used to write in debug mode.
data Flag = Flag { table :: Table
, factualId :: String
, problem :: Problem
, user :: String
, comment :: Maybe String
, dataJSON :: Maybe String
, fields :: Maybe [String]
, reference :: Maybe String
} deriving (Eq, Show)
-- The Flag type is a member of the Write typeclass so it can be sent as a post
-- request to the API.
instance Write Flag where
path flag = (show $ table flag) ++ "/" ++ (factualId flag) ++ "/flag"
params _ = M.empty
body flag = M.fromList [ ("problem", show $ problem flag)
, ("user", user flag)
, commentPair flag
, dataPair flag
, fieldsPair flag
, referencePair flag ]
-- The following functions are helpers for the body function
commentPair :: Flag -> (String, String)
commentPair flag
| comment flag == Nothing = ("comment", "")
| otherwise = ("comment", fromJust $ comment flag)
dataPair :: Flag -> (String, String)
dataPair flag
| dataJSON flag == Nothing = ("data", "")
| otherwise = ("data", fromJust $ dataJSON flag)
fieldsPair :: Flag -> (String, String)
fieldsPair flag
| fields flag == Nothing = ("fields", "")
| otherwise = ("fields", arrayString)
where arrayString = "[" ++ (join "," $ fromJust $ fields flag) ++ "]"
referencePair :: Flag -> (String, String)
referencePair flag
| reference flag == Nothing = ("reference", "")
| otherwise = ("reference", fromJust $ reference flag)