honeycomb-0.0.0.1: src/Honeycomb/API/Types.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Honeycomb.API.Types where
import Chronos
( builder_YmdHMS,
timeToDatetime,
w3c,
Datetime,
SubsecondPrecision(SubsecondPrecisionFixed),
Time )
import Data.Aeson
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text.Lazy as LT
import qualified Data.Text.Lazy.Builder as TB
import Data.Word
data Event = Event
{ eventSampleRate :: !(Maybe Word64)
, eventTimestamp :: !(Maybe Time)
, eventData :: !Object
}
instance ToJSON Event where
toJSON Event{..} = object $ ("data" .= eventData) : catMaybes
[ (\x -> "time" .= encodeRFC3339 (timeToDatetime x)) <$> eventTimestamp
, ("samplerate" .=) <$> eventSampleRate
]
toEncoding Event{..} = pairs $ mconcat
[ "data" .= eventData
, maybe mempty (\x -> "time" .= encodeRFC3339 (timeToDatetime x)) eventTimestamp
, maybe mempty ("samplerate" .=) eventSampleRate
]
-- | Construct a 'Text' 'TB.Builder' corresponding to the ISO-8601
-- encoding of the given 'Datetime'.
builderRFC3339 :: Datetime -> TB.Builder
builderRFC3339 dt = builder_YmdHMS (SubsecondPrecisionFixed 8) w3c dt <> "Z"
-- | Construct 'Text' corresponding to the ISO-8601
-- encoding of the given 'Datetime'.
encodeRFC3339 :: Datetime -> Text
encodeRFC3339 = LT.toStrict . TB.toLazyText . builderRFC3339