blockfrost-api-0.1.0.0: src/Blockfrost/Types/Common.hs
-- | Types for common servics
module Blockfrost.Types.Common
( URLVersion (..)
, Healthy (..)
, ServerTime (..)
, Metric (..)
) where
import Blockfrost.Types.Shared
import Data.Aeson
import Data.Text (Text)
import Deriving.Aeson
import Servant.Docs (ToSample (..), samples, singleSample)
import Test.QuickCheck.Arbitrary (Arbitrary (..))
import Test.QuickCheck.Instances ()
import Test.QuickCheck.Modifiers
-- | Root endpoint reply
data URLVersion = URLVersion
{ _urlVersionUrl :: Text
, _urlVersionVersion :: Text
}
deriving stock (Show, Eq, Generic)
deriving (FromJSON, ToJSON)
via CustomJSON '[FieldLabelModifier '[StripPrefix "_urlVersion", CamelToSnake]] URLVersion
instance ToSample URLVersion where
toSamples = pure $ singleSample $
URLVersion "http://blockfrost.io" "0.0.0"
-- | Health endpoint reply
newtype Healthy = Healthy
{ isHealthy :: Bool
}
deriving stock (Show, Eq, Generic)
deriving (FromJSON, ToJSON)
via CustomJSON '[FieldLabelModifier '[CamelToSnake]] Healthy
instance ToSample Healthy where
toSamples = pure $ singleSample $ Healthy False
-- | Health clock endpoint reply
newtype ServerTime = ServerTime
{ serverTime :: POSIXTime
}
deriving stock (Show, Eq, Generic)
instance FromJSON ServerTime where
parseJSON = withObject "ServerTime"
$ \v -> v .: "server_time"
>>= \t -> ServerTime . millisecondsToPosix <$> parseJSON @Integer t
instance ToJSON ServerTime where
toJSON (ServerTime t) =
object [
"server_time" .= posixToMilliseconds t
]
instance ToSample ServerTime where
toSamples _ = singleSample $ ServerTime $ millisecondsToPosix 1603400958947
instance Arbitrary ServerTime where
arbitrary = do
Positive (n :: Integer) <- arbitrary
pure $ ServerTime (fromInteger n / 1000)
-- | Metrics response
data Metric = Metric {
_metricTime :: POSIXTime
, _metricCalls :: Integer
}
deriving stock (Show, Eq, Generic)
deriving (FromJSON, ToJSON)
via CustomJSON '[FieldLabelModifier '[StripPrefix "_metric", CamelToSnake]] Metric
instance ToSample Metric where
toSamples _ = samples $
[ Metric 1612543884 42
, Metric 1614523884 6942
]
-- Re-use @Metric@ for response with endpoint field
instance {-# OVERLAPS #-} ToJSON (Text, Metric) where
toJSON (enp, m) = case toJSON m of
(Object o) -> Object (o <> ("endpoint" .= (toJSON enp)))
_ -> error "Absurd"
instance {-# OVERLAPS #-} FromJSON (Text, Metric) where
parseJSON v@(Object o) = do
enp <- o .: "endpoint"
ticker <- parseJSON v
return (enp, ticker)
parseJSON _ = fail "Unexpected type for (Text, Metric)"
instance {-# OVERLAPS #-} ToSample (Text, Metric) where
toSamples _ = samples $
[ ("block", Metric 1612543814 182)
, ("epoch", Metric 1612543814 42)
, ("block", Metric 1612543812 775)
, ("epoch", Metric 1612523884 4)
, ("block", Metric 1612553884 89794)
]