Package

purescript-open-foreign-generic

Repository
purescript-open-community/purescript-open-foreign-generic
License
MIT
Uploaded by
pacchettibotti
Published on
2024-09-24T13:59:36Z

Build Status

Generic deriving for purescript-foreign.

Example Usage

First, define some data type and derive Generic:

import Prelude
import Data.Generic.Rep (class Generic)
import Data.Generic.Rep.Show (genericShow)

newtype MyRecord = MyRecord { a :: Int }
derive instance genericMyRecord :: Generic MyRecord _
instance showMyRecord :: Show MyRecord where show = genericShow

To encode JSON, use genericEncodeJSON:

import Foreign.Generic (defaultOptions, genericEncodeJSON)

opts = defaultOptions { unwrapSingleConstructors = true }

genericEncodeJSON opts (MyRecord { a: 1 })
-- "{\"a\":1}"

And to decode JSON, use genericDecodeJSON:

import Control.Monad.Except (runExcept)
import Foreign.Generic (genericDecodeJSON)

runExcept (genericDecodeJSON opts "{\"a\":1}" :: _ MyRecord)
-- (Right (MyRecord { a: 1 }))

Badly formed JSON will result in a useful error, which can be inspected or pretty-printed:

import Data.Bifunctor (lmap)
import Foreign (renderForeignError)

lmap (map renderForeignError) $ runExcept (genericDecodeJSON opts "{\"a\":\"abc\"}" :: _ MyRecord)
-- (Left
--   (NonEmptyList
--     (NonEmpty
--       "Error at array index 0: (ErrorAtProperty \"a\" (TypeMismatch \"Int\" \"String\"))"
--       Nil)))