Skip to content

cdepillabout/envelope

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Web.Envelope

Build Status Hackage Stackage LTS Stackage Nightly BSD3 license

This module exports an Envelope type that can be used to wrap reponses from a JSON REST API. It provides a successful Success response, and a failure Err response.

Here is a small demonstration of returning a success response:

>>> import qualified Data.ByteString.Lazy.Char8 as C8
>>> import Data.Aeson (decode, encode)
>>> let successEnvelope = toSuccessEnvelope 3 :: Envelope Text Int
>>> C8.putStrLn $ encode successEnvelope
{"data":3}
>>> decode "{\"data\":3}" :: Maybe (Envelope Text Int)
Just (EnvelopeSuccess (Success 3))

Your data gets wrapped in an object with a single "data" field:

{
    "data": 3
}

Now lets look at how an error response is encoded and decoded. It is encoded as an object with two members: @"extra"@ and @"error"@.

>>> let errorEnvelope = toErrEnvelope "DB_ERROR" "there was an error in the database" :: Envelope String Int
>>> C8.putStrLn $ encode errorEnvelope
{"extra":"there was an error in the database","error":"DB_ERROR"}
>>> decode "{\"extra\":\"there was an error in the database\",\"error\":\"DB_ERROR\"}" :: Maybe (Envelope String Int)
Just (EnvelopeErr (Err {errErr = "DB_ERROR", errExtra = Just "there was an error in the database"}))

Your error type and extra message get wrapped in an object:

{
    "extra": "there was an error in the database",
    "error": "DB_ERROR"
}