{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE StandaloneDeriving #-}
module Versioning.Internal.Base
  ( Bare
  )
where


import           Data.Aeson   (FromJSON (..), ToJSON (..), Value (..))
import           GHC.Generics (Generic)

-- | An uninhabited type.
--   We define our own type instead of using "Data.Void"
--   because we need additional instances.
--   Moreover this type is internal.
--   Users are supposed to use 'NA' to express absence.
data Bare

deriving instance Eq Bare

deriving instance Generic Bare

deriving instance Show Bare

-- Attempting to supply a value for an absent field must produce a
-- parsing failure
instance FromJSON Bare where
    parseJSON :: Value -> Parser Bare
parseJSON Value
_ = String -> Parser Bare
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"An NA field should be absent or null"

-- We provide an instance to make the compiler happy.
-- In practice it will never be used.
instance ToJSON Bare where
    toJSON :: Bare -> Value
toJSON Bare
_ = Value
Null