diff --git a/src/Data/Argonaut/Decode/Combinators.purs b/src/Data/Argonaut/Decode/Combinators.purs index 0a18d82..b7eaad5 100644 --- a/src/Data/Argonaut/Decode/Combinators.purs +++ b/src/Data/Argonaut/Decode/Combinators.purs @@ -5,7 +5,7 @@ import Prelude import Data.Argonaut.Core (JObject) import Data.Argonaut.Decode.Class (class DecodeJson, decodeJson) import Data.Either (Either(..)) -import Data.Maybe (maybe) +import Data.Maybe (Maybe(Just, Nothing), maybe) import Data.StrMap as SM getField :: forall a. DecodeJson a => JObject -> String -> Either String a @@ -16,3 +16,14 @@ getField o s = (SM.lookup s o) infix 7 getField as .? + +getFieldOptional :: forall a. DecodeJson a => JObject -> String -> Either String (Maybe a) +getFieldOptional o s = + maybe + (pure Nothing) + decode + (SM.lookup s o) + where + decode json = Just <$> decodeJson json + +infix 7 getFieldOptional as .?? diff --git a/test/Test/Main.purs b/test/Test/Main.purs index 281c02e..d040f39 100644 --- a/test/Test/Main.purs +++ b/test/Test/Main.purs @@ -143,6 +143,7 @@ data User | Guest String | Registered { name :: String + , bio :: Maybe String , age :: Int , balance :: Number , banned :: Boolean @@ -169,6 +170,7 @@ genericsCheck = do logShow $ gEncodeJson $ Guest "guest's handle" logShow $ gEncodeJson $ Registered { name: "user1" + , bio: Just "Ordinary User" , age: 5 , balance: 26.6 , banned: false @@ -178,6 +180,7 @@ genericsCheck = do , Guest "someGuest" , Registered { name: "user2" + , bio: Nothing , age: 6 , balance: 32.1 , banned: false