From 7c33e777463c8eed95e9848ac05bf450e950e381 Mon Sep 17 00:00:00 2001 From: Harry Garrood Date: Wed, 13 Jan 2016 17:34:55 +0000 Subject: [PATCH 1/2] Add test for Either instance --- test/Test/Main.purs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/Test/Main.purs b/test/Test/Main.purs index cd2afba..02d26d1 100644 --- a/test/Test/Main.purs +++ b/test/Test/Main.purs @@ -183,7 +183,18 @@ genericsCheck = do }]} +eitherCheck = do + log "Test EncodeJson/DecodeJson Either instance" + quickCheck \(x :: Either String String) -> + case decodeJson (encodeJson x) of + Right decoded -> + decoded == x + ("x = " <> show x <> ", decoded = " <> show decoded) + Left err -> + false err + main = do + eitherCheck encodeDecodeCheck combinatorsCheck genericsCheck From 9a075bcf6c6cde09e22a61577943ff24e943d103 Mon Sep 17 00:00:00 2001 From: Harry Garrood Date: Wed, 13 Jan 2016 17:56:16 +0000 Subject: [PATCH 2/2] Fix EncodeJson/DecodeJson Either instances --- src/Data/Argonaut/Decode.purs | 18 +++++++++++++++++- src/Data/Argonaut/Encode.purs | 12 ++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Data/Argonaut/Decode.purs b/src/Data/Argonaut/Decode.purs index db22df2..1d9b303 100644 --- a/src/Data/Argonaut/Decode.purs +++ b/src/Data/Argonaut/Decode.purs @@ -77,7 +77,23 @@ instance decodeJsonTuple :: (DecodeJson a, DecodeJson b) => DecodeJson (Tuple a f _ = Left "Couldn't decode Tuple" instance decodeJsonEither :: (DecodeJson a, DecodeJson b) => DecodeJson (Either a b) where - decodeJson j = (Left <$> decodeJson j) <|> (Right <$> decodeJson j) + decodeJson j = + case toObject j of + Just obj -> do + tag <- just (M.lookup "tag" obj) + val <- just (M.lookup "value" obj) + case toString tag of + Just "Right" -> + Right <$> decodeJson val + Just "Left" -> + Left <$> decodeJson val + _ -> + Left "Couldn't decode Either" + _ -> + Left "Couldn't decode Either" + where + just (Just x) = Right x + just Nothing = Left "Couldn't decode Either" instance decodeJsonNull :: DecodeJson Unit where decodeJson = foldJsonNull (Left "Not null") (const $ Right unit) diff --git a/src/Data/Argonaut/Encode.purs b/src/Data/Argonaut/Encode.purs index 1742e89..064ac29 100644 --- a/src/Data/Argonaut/Encode.purs +++ b/src/Data/Argonaut/Encode.purs @@ -8,11 +8,11 @@ module Data.Argonaut.Encode import Prelude import Data.Argonaut.Core (Json(), jsonNull, fromBoolean, fromNumber, fromString, fromArray, fromObject) -import Data.Either (Either(..)) +import Data.Either (Either(..), either) import Data.Foldable (foldr) import Data.Generic (Generic, GenericSpine(..), toSpine) import Data.Int (toNumber) -import Data.List (List(), fromList) +import Data.List (List(..), fromList) import Data.Map as M import Data.Maybe (Maybe(..)) import Data.String (fromChar) @@ -50,8 +50,12 @@ instance encodeJsonTuple :: (EncodeJson a, EncodeJson b) => EncodeJson (Tuple a encodeJson (Tuple a b) = encodeJson [encodeJson a, encodeJson b] instance encodeJsonEither :: (EncodeJson a, EncodeJson b) => EncodeJson (Either a b) where - encodeJson (Left a) = encodeJson a - encodeJson (Right b) = encodeJson b + encodeJson = either (obj "Left") (obj "Right") + where + obj :: forall c. (EncodeJson c) => String -> c -> Json + obj tag x = + fromObject $ SM.fromList $ + Cons (Tuple "tag" (fromString tag)) (Cons (Tuple "value" (encodeJson x)) Nil) instance encodeJsonUnit :: EncodeJson Unit where encodeJson = const jsonNull