{-# LANGUAGE NoImplicitPrelude #-}
module Preamble.Aeson
( camelOptions
, snakeOptions
, spinalOptions
, maybeResult
, eitherResult
) where
import Data.Aeson.Types
import Data.Char
import Data.Text
import Data.Text.Manipulate
import Preamble.Prelude hiding (dropWhile)
unprefix :: Text -> Text
unprefix = dropWhile (not . isUpper)
camelOptions :: Options
camelOptions = defaultOptions
{ fieldLabelModifier = unpack . toCamel . unprefix . pack
, constructorTagModifier = unpack . toCamel . unprefix . lowerHead . pack
, omitNothingFields = True
, allNullaryToStringTag = True
, sumEncoding = TaggedObject
{ tagFieldName = "type"
, contentsFieldName = "data"
}
}
snakeOptions :: Options
snakeOptions = defaultOptions
{ fieldLabelModifier = unpack . toSnake . unprefix . pack
, constructorTagModifier = unpack . toSnake . unprefix . lowerHead . pack
, omitNothingFields = True
, allNullaryToStringTag = True
, sumEncoding = TaggedObject
{ tagFieldName = "type"
, contentsFieldName = "data"
}
}
spinalOptions :: Options
spinalOptions = defaultOptions
{ fieldLabelModifier = unpack . toSpinal . unprefix . pack
, constructorTagModifier = unpack . toSpinal . unprefix . lowerHead . pack
, omitNothingFields = True
, allNullaryToStringTag = True
, sumEncoding = TaggedObject
{ tagFieldName = "type"
, contentsFieldName = "data"
}
}
maybeResult :: Result a -> Maybe a
maybeResult (Error _s) = Nothing
maybeResult (Success a) = Just a
eitherResult :: Result a -> Either String a
eitherResult (Error s) = Left s
eitherResult (Success a) = Right a