module APIBuilder.Decoding ( decode ) where import APIBuilder.Error import Data.Aeson.Types (parseEither) import Data.Aeson.Parser (value) import Data.Aeson (FromJSON, parseJSON) import Data.Attoparsec.Lazy (parse, eitherResult) import qualified Data.ByteString.Lazy as BS decode :: (FromJSON a, FromJSON e) => BS.ByteString -> Either (APIError e) a decode s = case eitherDecode s of Right x -> Right x Left err -> case eitherDecode s of Right x -> Left $ APIError x Left _ -> Left $ ParseError err eitherDecode :: (FromJSON a) => BS.ByteString -> Either String a eitherDecode s = eitherResult (parse value s) >>= parseEither parseJSON