{-# LANGUAGE DeriveGeneric, OverloadedStrings #-} module GEODE.Metadata.Work ( Work(..) ) where import Data.Aeson (FromJSON(..), ToJSON(..), withText) import Data.ByteString.Char8 as ByteString (unpack) import Data.Csv (FromField(..), ToField(..)) import Data.Char (toLower) import Data.Text as Text (unpack) import GHC.Generics (Generic) data Work = EDdA | LGE | Wikipedia deriving (Eq, Generic, Ord, Show) tolerantParser :: (Applicative m, Monoid (m Work)) => String -> m Work tolerantParser = recognize . fmap toLower where recognize "edda" = pure EDdA recognize "lge" = pure LGE recognize "wikipedia" = pure Wikipedia recognize _ = mempty instance FromField Work where parseField = tolerantParser . ByteString.unpack instance ToField Work where toField = toField . show instance ToJSON Work instance FromJSON Work where parseJSON = withText "Work" $ tolerantParser . Text.unpack