{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module Hindsight.Store.Parsing (
parseEventPayload,
parseStoredEventToEnvelope,
createEventEnvelope,
)
where
import Data.Aeson qualified as Aeson
import Data.Aeson.Types (parseEither)
import Data.Map qualified as Map
import Data.Proxy (Proxy (..))
import Data.Time (UTCTime)
import Hindsight.Events (CurrentPayloadType, Event, parseMapFromProxy)
import Hindsight.Store (CorrelationId, Cursor, EventEnvelope (..), EventId, StreamId, StreamVersion)
parseEventPayload ::
forall event.
(Event event) =>
Proxy event ->
Aeson.Value ->
Integer ->
Maybe (CurrentPayloadType event)
parseEventPayload :: forall (event :: Symbol).
Event event =>
Proxy event -> Value -> Integer -> Maybe (CurrentPayloadType event)
parseEventPayload Proxy event
proxy Value
payloadJson Integer
eventPayloadVersion = do
let parserMap :: Map Int (Value -> Parser (CurrentPayloadType event))
parserMap = Proxy event -> Map Int (Value -> Parser (CurrentPayloadType event))
forall (event :: Symbol).
Event event =>
Proxy event -> Map Int (Value -> Parser (CurrentPayloadType event))
parseMapFromProxy Proxy event
proxy
case Int
-> Map
Int
(Value -> Parser (FinalVersionType (FromList (Versions event))))
-> Maybe
(Value -> Parser (FinalVersionType (FromList (Versions event))))
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
eventPayloadVersion) Map
Int
(Value -> Parser (FinalVersionType (FromList (Versions event))))
Map Int (Value -> Parser (CurrentPayloadType event))
parserMap of
Just Value -> Parser (FinalVersionType (FromList (Versions event)))
parser -> case (Value -> Parser (FinalVersionType (FromList (Versions event))))
-> Value
-> Either String (FinalVersionType (FromList (Versions event)))
forall a b. (a -> Parser b) -> a -> Either String b
parseEither Value -> Parser (FinalVersionType (FromList (Versions event)))
parser Value
payloadJson of
Right FinalVersionType (FromList (Versions event))
payload -> FinalVersionType (FromList (Versions event))
-> Maybe (FinalVersionType (FromList (Versions event)))
forall a. a -> Maybe a
Just FinalVersionType (FromList (Versions event))
payload
Left String
_ -> Maybe (FinalVersionType (FromList (Versions event)))
Maybe (CurrentPayloadType event)
forall a. Maybe a
Nothing
Maybe
(Value -> Parser (FinalVersionType (FromList (Versions event))))
Nothing -> Maybe (FinalVersionType (FromList (Versions event)))
Maybe (CurrentPayloadType event)
forall a. Maybe a
Nothing
createEventEnvelope ::
forall event backend.
EventId ->
StreamId ->
Cursor backend ->
StreamVersion ->
Maybe CorrelationId ->
UTCTime ->
CurrentPayloadType event ->
EventEnvelope event backend
createEventEnvelope :: forall (event :: Symbol) backend.
EventId
-> StreamId
-> Cursor backend
-> StreamVersion
-> Maybe CorrelationId
-> UTCTime
-> CurrentPayloadType event
-> EventEnvelope event backend
createEventEnvelope EventId
eventId StreamId
streamId Cursor backend
cursor StreamVersion
streamVer Maybe CorrelationId
corrId UTCTime
timestamp CurrentPayloadType event
payload =
EventWithMetadata
{ eventId :: EventId
eventId = EventId
eventId
, streamId :: StreamId
streamId = StreamId
streamId
, position :: Cursor backend
position = Cursor backend
cursor
, streamVersion :: StreamVersion
streamVersion = StreamVersion
streamVer
, correlationId :: Maybe CorrelationId
correlationId = Maybe CorrelationId
corrId
, createdAt :: UTCTime
createdAt = UTCTime
timestamp
, payload :: CurrentPayloadType event
payload = CurrentPayloadType event
payload
}
parseStoredEventToEnvelope ::
forall event backend.
(Event event) =>
Proxy event ->
EventId ->
StreamId ->
Cursor backend ->
StreamVersion ->
Maybe CorrelationId ->
UTCTime ->
Aeson.Value ->
Integer ->
Maybe (EventEnvelope event backend)
parseStoredEventToEnvelope :: forall (event :: Symbol) backend.
Event event =>
Proxy event
-> EventId
-> StreamId
-> Cursor backend
-> StreamVersion
-> Maybe CorrelationId
-> UTCTime
-> Value
-> Integer
-> Maybe (EventEnvelope event backend)
parseStoredEventToEnvelope Proxy event
proxy EventId
eventId StreamId
streamId Cursor backend
cursor StreamVersion
streamVer Maybe CorrelationId
corrId UTCTime
timestamp Value
payloadJson Integer
eventPayloadVersion = do
payload <- Proxy event -> Value -> Integer -> Maybe (CurrentPayloadType event)
forall (event :: Symbol).
Event event =>
Proxy event -> Value -> Integer -> Maybe (CurrentPayloadType event)
parseEventPayload Proxy event
proxy Value
payloadJson Integer
eventPayloadVersion
pure $ createEventEnvelope eventId streamId cursor streamVer corrId timestamp payload