module Rattletrap.Type.Word64le
  ( Word64le(..)
  )
where

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import qualified Data.Scientific as Scientific
import qualified Data.Text as Text
import qualified Data.Word as Word
import qualified Text.Read as Read

newtype Word64le = Word64le
  { word64leValue :: Word.Word64
  } deriving (Eq, Ord, Show)

instance Aeson.FromJSON Word64le where
  parseJSON value = case value of
    Aeson.String text -> case Read.readEither $ Text.unpack text of
      Left _ -> Aeson.typeMismatch "Word64le" value
      Right word64 -> pure $ Word64le word64
    Aeson.Number number -> case Scientific.toBoundedInteger number of
      Nothing -> Aeson.typeMismatch "Word64le" value
      Just word64 -> pure $ Word64le word64
    _ -> Aeson.typeMismatch "Word64le" value

instance Aeson.ToJSON Word64le where
  toJSON = Aeson.toJSON . show . word64leValue