packages feed

keiro-dsl-0.2.0.0: test/conformance-skeletons/SkelRouter/Generated/MyService/Page/Codec.hs

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}

-- @generated by keiro-dsl; do not edit. Regenerated from the .keiro spec.
module SkelRouter.Generated.MyService.Page.Codec (
    pageCodec,
    parsePageEvent,
    encodePageEvent,
) where

import Data.Aeson (Value, object, withObject, (.:), (.=))
import Data.Aeson.Types (Parser, parseEither)
import Data.List.NonEmpty (NonEmpty (..))
import Data.Text (Text)
import Data.Text qualified as T
import Keiro.Codec (Codec (..), EventType (..))
import SkelRouter.Generated.MyService.Page.Domain

pageCodec :: Codec PageEvent
pageCodec =
    Codec
        { eventTypes = EventType "PageSent" :| []
        , eventType = \case
            PageSent{} -> EventType "PageSent"
        , schemaVersion = 1
        , encode = encodePageEvent
        , decode = parsePageEvent
        , upcasters = []
        }

encodePageEvent :: PageEvent -> Value
encodePageEvent = \case
    PageSent payload ->
        object
            [ "kind" .= ("PageSent" :: Text)
            , "incidentId" .= payload.incidentId
            , "responderId" .= payload.responderId
            ]

parsePageEvent :: EventType -> Value -> Either Text PageEvent
parsePageEvent (EventType tag) = mapLeftText . parseEither (withObject "PageEvent" go)
  where
    go o = do
        case tag of
            "PageSent" ->
                PageSent <$> (PageSentData <$> o .: "incidentId" <*> o .: "responderId")
            _ -> fail "unknown event type"

mapLeftText :: Either String b -> Either Text b
mapLeftText = either (Left . T.pack) Right