Skip to content

Commit 0260407

Browse files
authored
Merge pull request #17 from passy/maybe-combinator
Add a combinator for decoding maybe fields
2 parents 44fc324 + 631d82e commit 0260407

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/Data/Argonaut/Decode/Combinators.purs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Prelude
55
import Data.Argonaut.Core (JObject)
66
import Data.Argonaut.Decode.Class (class DecodeJson, decodeJson)
77
import Data.Either (Either(..))
8-
import Data.Maybe (maybe)
8+
import Data.Maybe (Maybe(Just, Nothing), maybe)
99
import Data.StrMap as SM
1010

1111
getField :: forall a. DecodeJson a => JObject -> String -> Either String a
@@ -16,3 +16,14 @@ getField o s =
1616
(SM.lookup s o)
1717

1818
infix 7 getField as .?
19+
20+
getFieldOptional :: forall a. DecodeJson a => JObject -> String -> Either String (Maybe a)
21+
getFieldOptional o s =
22+
maybe
23+
(pure Nothing)
24+
decode
25+
(SM.lookup s o)
26+
where
27+
decode json = Just <$> decodeJson json
28+
29+
infix 7 getFieldOptional as .??

test/Test/Main.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ data User
143143
| Guest String
144144
| Registered
145145
{ name :: String
146+
, bio :: Maybe String
146147
, age :: Int
147148
, balance :: Number
148149
, banned :: Boolean
@@ -169,6 +170,7 @@ genericsCheck = do
169170
logShow $ gEncodeJson $ Guest "guest's handle"
170171
logShow $ gEncodeJson $ Registered
171172
{ name: "user1"
173+
, bio: Just "Ordinary User"
172174
, age: 5
173175
, balance: 26.6
174176
, banned: false
@@ -178,6 +180,7 @@ genericsCheck = do
178180
, Guest "someGuest"
179181
, Registered
180182
{ name: "user2"
183+
, bio: Nothing
181184
, age: 6
182185
, balance: 32.1
183186
, banned: false

0 commit comments

Comments
 (0)