From ab32d9d5e9d2063cd932ba54149ed5042fb3097f Mon Sep 17 00:00:00 2001 From: Steffen Jost Date: Thu, 30 Jun 2022 17:59:52 +0200 Subject: [PATCH] refactor(avs): add case-insensitive aeson parsing facilities --- src/Utils/Avs.hs | 25 +++++++++++++++---------- testdata/avs_json.hs | 4 ++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Utils/Avs.hs b/src/Utils/Avs.hs index c9cf80ace..fe94de9c3 100644 --- a/src/Utils/Avs.hs +++ b/src/Utils/Avs.hs @@ -5,28 +5,32 @@ module Utils.Avs where import Import.NoModel hiding ((.=)) import Utils.Lens hiding ((.=)) --- import qualified Data.HashMap.Lazy as HM -import qualified Data.Text as Text +import qualified Data.Set as Set +import qualified Data.Text as Text +import qualified Data.HashMap.Lazy as HM + import Data.Aeson import Data.Aeson.Types import Servant import Servant.Client --- just to speed up type checking -import qualified Data.Set as Set -import qualified Network.HTTP.Client as HTTP (newManager, defaultManagerSettings) - - +-- import qualified Network.HTTP.Client as HTTP (newManager, defaultManagerSettings) -- just to speed up type checking -- | Like (.:) but attempts parsing with case-insensitve keys as fallback. +-- Note that the type also works for optional Field -- Taken from Data.Aeson.Filthy, which could somehow not be added as a dependency. -{- -(.:~) :: FromJSON a => Object -> Text -> Parser a -- would be useful for AvsDataPersonStatus, where Case is inconsistently encoded +(.:~) :: FromJSON a => Object -> Text -> Parser a o .:~ key = o .: key <|> maybe empty parseJSON go where go = lookup (Text.toLower key) [(Text.toLower k, v) | (k,v) <- HM.toList o] + +{- +-- Like (.:?) but attempts parsing with case-insensitve keys as fallback. +(.:?~) :: FromJSON a => Object -> Text -> Parser (Maybe a) +o .:?~ key = o .: key <|> maybe empty parseJSON go + where go = lookup (Text.toLower key) [(Text.toLower k, v) | (k,v) <- HM.toList o] -} newtype SloppyBool = SloppyBool { sloppyBool :: Bool } @@ -229,7 +233,7 @@ mkAvsQuery basicAuth cliEnv = AvsQuery (rawQueryPerson :<|> rawQueryStatus) = client avsApi basicAuth - +{- -- DEMO to check that it types here instead of waiting for Application to be compiled run :: IO () run = do @@ -252,3 +256,4 @@ run = do } avsAuth = BasicAuthData "foo" "bar" +-} \ No newline at end of file diff --git a/testdata/avs_json.hs b/testdata/avs_json.hs index 8930c87f7..fd674ac7a 100644 --- a/testdata/avs_json.hs +++ b/testdata/avs_json.hs @@ -16,13 +16,13 @@ test1 :: Either String AvsResponseStatus test1 = eitherDecode status1 person1 :: B.ByteString -person1 = fromString "[{\"PersonID\":518870,\"PersonNo\":508870,\"InternalPersonalNo\":\"00057138\",\"LastName\":\"Jost\",\"FirstName\":\"Steffen\",\"personCards\":[{\"Firm\":\"AVN-AR2\",\"City\":null,\"Street\":null,\"PostalCode\":null,\"CardNo\":\"00158446\",\"VersionNo\":\"4\",\"CardColor\":\"Gelb\",\"CardAreas\":\"\",\"Valid\":\"true\",\"ValidTo\":\"2024-05-20\",\"IssueDate\":\"2019-09-02\"}]}]" +person1 = fromString "[{\"PersonID\":518870,\"PersonNo\":508870,\"InternalPersonalNo\":\"00057138\",\"LastName\":\"Jost\",\"FirstName\":\"Steffen\",\"personCards\":[{\"Firm\":\"AVN-AR2\",\"City\":null,\"Street\":null,\"poStalcoDe\":\"64854\",\"CardNo\":\"00158446\",\"VersionNo\":\"4\",\"caRdcolor\":\"Violet\",\"CardAreas\":\"\",\"Valid\":\"true\",\"ValidTo\":\"2024-05-20\",\"IssueDate\":\"2019-09-02\"}]}]" test2 :: Either String AvsResponsePerson test2 = eitherDecode person1 person2 :: B.ByteString -person2 = fromString "[{\"PersonID\":4026895,\"PersonNo\":1200216,\"InternalPersonalNo\":\"00056057\",\"LastName\":\"Zatschker\",\"FirstName\":\"Laura\",\"personCards\":[{\"Firm\":\"AVN-SR1\",\"City\":null,\"Street\":null,\"PostalCode\":null,\"CardNo\":\"00048614\",\"VersionNo\":\"4\",\"CardColor\":\"Gelb\",\"CardAreas\":\"F\",\"Valid\":\"true\",\"ValidTo\":\"2024-01-15\",\"IssueDate\":\"2020-03-18\"}]}]" +person2 = fromString "[{\"PersonID\":4026895,\"PersonNo\":1200216,\"InternalPersonalNo\":\"00056057\",\"LastName\":\"Zatschker\",\"FirstName\":\"Laura\",\"personCards\":[{\"Firm\":\"AVN-SR1\",\"City\":null,\"Street\":null,\"PostalCode\":\"64853\",\"CardNo\":\"00048614\",\"VersionNo\":\"4\",\"CardColor\":\"Gelb\",\"CardAreas\":\"F\",\"Valid\":\"true\",\"ValidTo\":\"2024-01-15\",\"IssueDate\":\"2020-03-18\"}]}]" test3 :: Either String AvsResponsePerson test3 = eitherDecode person2