packages feed

A-gent-0.11.0.0: src/Agent/JSON.hs

{-# OPTIONS_GHC -Wall -Werror #-}

{-# LANGUAGE Safe                         #-}
{-# LANGUAGE NoGeneralizedNewtypeDeriving #-}

--------------------------------------------------------------------------------

-- |
-- Copyright  : (c) 2026 SPISE MISU ApS
-- License    : SSPL-1.0 OR AGPL-3.0-only
-- Maintainer : SPISE MISU <mail+hackage@spisemisu.com>
-- Stability  : experimental

--------------------------------------------------------------------------------

module Agent.JSON
  ( -- * Infer JSON from Data
    Data
    -- * JSON Encoder/Decoder
  , DecodeError(InvalidJSON, DiffSchema)
  , encode
  , decode
  )
where

--------------------------------------------------------------------------------

import Data.Data
  ( Data
  )

import Internal.GaloisInc.Text.JSON.Generic
  ( Result(Error, Ok)
  , encodeJSON
  , fromJSON
  )
import Internal.GaloisInc.Text.JSON.String
  ( readJSValue
  , runGetJSON
  )

--------------------------------------------------------------------------------

data DecodeError
  = InvalidJSON
  | DiffSchema

--------------------------------------------------------------------------------

encode
  :: Data a
  => a
  -> String
encode = encodeJSON

decode
  :: Data a
  => String
  -> Either DecodeError a
decode json =
  case runGetJSON readJSValue json of
    Left  _ -> Left InvalidJSON
    Right v ->
      case fromJSON v of
        Error _ -> Left  DiffSchema
        Ok    a -> Right a