Generic deriving for purescript-foreign
.
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)))