From b7650a2ad9c19264cfeee3449a3270dde98eafb5 Mon Sep 17 00:00:00 2001 From: Alice BRENON <alice.brenon@ens-lyon.fr> Date: Tue, 26 Sep 2023 13:29:42 +0200 Subject: [PATCH] Implement JSON conversion for Work type --- lib/GEODE/Metadata/Work.hs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/GEODE/Metadata/Work.hs b/lib/GEODE/Metadata/Work.hs index 9c0aa93..68e4117 100644 --- a/lib/GEODE/Metadata/Work.hs +++ b/lib/GEODE/Metadata/Work.hs @@ -1,25 +1,30 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE DeriveGeneric, OverloadedStrings #-} module GEODE.Metadata.Work ( Work(..) ) where -import Data.Aeson (ToJSON(..)) +import Data.Aeson (FromJSON(..), ToJSON(..), withText) +import Data.ByteString.Char8 as ByteString (unpack) import Data.Csv (FromField(..), ToField(..)) import Data.Char (toLower) -import Data.ByteString.Char8 as ByteString (map) +import Data.Text as Text (unpack) +import GHC.Generics (Generic) -data Work = EDdA | LGE | Wikipedia deriving (Eq, Ord, Read, Show) +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 = recognize . ByteString.map toLower - where - recognize "EDdA" = pure EDdA - recognize "LGE" = pure LGE - recognize "Wikipedia" = pure Wikipedia - recognize _ = mempty + parseField = tolerantParser . ByteString.unpack instance ToField Work where toField = toField . show -instance ToJSON Work where - toJSON = toJSON . show - +instance ToJSON Work +instance FromJSON Work where + parseJSON = withText "Work" $ tolerantParser . Text.unpack -- GitLab