packages feed

keiro-dsl-0.6.0.0: test/conformance-replay/Generated/ReplayDivergence/Note/Codec.hs

{-# LANGUAGE OverloadedRecordDot #-}

-- @generated by keiro-dsl; do not edit. Regenerated from the .keiro spec.
module Generated.ReplayDivergence.Note.Codec (
    noteCodec,
    parseNoteEvent,
    encodeNoteEvent,
) 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 Generated.ReplayDivergence.Note.Domain
import Keiro.Codec (Codec (..), EventType (..))

noteCodec :: Codec NoteEvent
noteCodec =
    Codec
        { eventTypes = EventType "NoteWritten" :| []
        , eventType = \case
            NoteWritten{} -> EventType "NoteWritten"
        , schemaVersion = 1
        , encode = encodeNoteEvent
        , decode = parseNoteEvent
        , upcasters = []
        }

encodeNoteEvent :: NoteEvent -> Value
encodeNoteEvent = \case
    NoteWritten payload ->
        object
            [ "kind" .= ("NoteWritten" :: Text)
            , "noteText" .= payload.noteText
            , "echo" .= payload.echo
            ]

parseNoteEvent :: EventType -> Value -> Either Text NoteEvent
parseNoteEvent (EventType tag) = mapLeftText . parseEither (withObject "NoteEvent" go)
  where
    go o = do
        case tag of
            "NoteWritten" ->
                NoteWritten <$> (NoteWrittenData <$> o .: "noteText" <*> o .: "echo")
            _ -> fail "unknown event type"

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