Haskell JSON decode with field-level errors
Haskell
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson (Value (..), eitherDecodeStrict')
import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString as B
parsePort :: B.ByteString -> Either String Int
parsePort raw = case eitherDecodeStrict' raw :: Either String Value of
Left err -> Left ("invalid JSON: " <> err)
Right (Object o) -> case KM.lookup "port" o of
Nothing -> Left "$.port: missing required field"
Just (Number n) -> Right (round n)
Just _ -> Left "$.port: expected a number"
Right _ -> Left "$: expected the JSON object"