It took me a while to figure out how to get an API off the ground because I couldn’t find any ready examples of non-text types and had to search quite a bit. In summary here are the stuff that worked:
- When the error says
A web handler threw an exception. Details: UnexpectedNull {...}The keyword there was null so use Maybe types rather than Just types (matching types can be found here) - To render date types, define it as
Maybe Day(orDate) then when serializing it to a Value type in toJSON… use a form like this to get a type allowed, see instances listed here:T.pack "last_used" .= show last_used - See this list of types for FromField to know what postgresql-simple can handle
-- Example of Types.hs
import qualified Data.Text as T
import Data.Time.Calendar
data Clothing = Clothing
{ brand :: T.Text
, size :: Maybe Int
, last_worn :: Maybe Day
}
instance FromRow Clothing where
fromRow = Clothing field field field
instance ToJSON Clothing where
toJSON (Clothing brand size last_worn) = object [
"brand" .= brand
, "size" .= size
, T.pack "last_worn" .= show last_worn
]