tempodb-0.1.1.1: src/Database/Tempodb/Types.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module Database.Tempodb.Types where
import Prelude as P
import Control.Applicative
import Control.Monad
import Control.Monad.Reader
import Data.Aeson
import Data.ByteString.Char8 as C8
import Data.Map (Map)
import Network.Http.Client
-- | It's easy to mix up which one is first so let's newtype these
-- suckers to make it explicit.
newtype ApiKey = ApiKey {unKey :: ByteString} deriving (Show, Eq, Ord)
newtype ApiSec = ApiSec {unSec :: ByteString} deriving (Show, Eq, Ord)
data BasicAuth = BasicAuth ApiKey ApiSec
deriving (Show, Eq, Ord)
-- | Custom TempoDB ReaderT monad.
newtype Tempodb a = Tempodb {
runTDB :: ReaderT (RequestBuilder ()) IO a
} deriving (Monad, MonadIO, MonadReader (RequestBuilder ()))
runTempoDB :: BasicAuth -> Tempodb a -> IO a
runTempoDB auth f = runReaderT (runTDB f) $ baseRequest auth
baseRequest :: BasicAuth -> RequestBuilder ()
baseRequest (BasicAuth k s) =
setAuthorizationBasic (unKey k) (unSec s)
data IdOrKey = SeriesId ByteString | SeriesKey ByteString
deriving (Show, Eq, Ord)
-- | Datatype for TempoDB Series Metadata.
data Series = Series
{ id :: ByteString
, key :: ByteString
, name :: ByteString
, tags :: [ByteString]
, attributes :: Map ByteString ByteString
} deriving (Show, Eq, Ord)
instance FromJSON Series where
parseJSON (Object o) = Series <$>
o .: "id" <*>
o .: "key" <*>
o .: "name" <*>
o .: "tags" <*>
o .: "attributes"
parseJSON _ = mzero
instance ToJSON Series where
toJSON (Series i k n t a) = object
[ "id" .= i
, "key" .= k
, "name" .= n
, "tags" .= t
, "attributes" .= a
]
-- data SeriesData = SeriesData
-- { series :: Series
-- , start ::
-- , end ::
-- }