packages feed

kansoku-api-0.2.0.0: src/Kansoku/Prelude.hs

{-# LANGUAGE PackageImports #-}

-- | The Kansoku project prelude. Every Kansoku module imports this instead of
-- re-importing Text, Generic, the aeson class machinery, lens operators, etc.
module Kansoku.Prelude
  ( module X,
    module Control.Lens,
    eventAesonOptions,
  )
where

import "aeson" Data.Aeson as X
  ( FromJSON,
    Options,
    SumEncoding (..),
    ToJSON,
    camelTo2,
    defaultOptions,
    fromJSON,
    genericParseJSON,
    genericToJSON,
    parseJSON,
    toEncoding,
    toJSON,
  )
import "aeson" Data.Aeson qualified as Aeson
import "base" Control.Applicative as X ((<|>))
import "base" Control.Monad as X (guard, unless, void, when)
import "base" Control.Monad.IO.Class as X (MonadIO, liftIO)
import "base" Data.List.NonEmpty as X (NonEmpty (..))
import "base" Data.Maybe as X (fromMaybe, isJust, isNothing)
import "base" Data.Proxy as X (Proxy (..))
import "base" GHC.Generics as X (Generic)
import "lens" Control.Lens
import "text" Data.Text as X (Text)
import "time" Data.Time as X (UTCTime, getCurrentTime)

-- | Standard Aeson options for Kansoku event/command sum types. Encodes as
-- {"type": "snake_case_tag", "data": {...}} with snake_cased constructor tags.
eventAesonOptions :: Options
eventAesonOptions =
  defaultOptions
    { Aeson.sumEncoding = Aeson.TaggedObject "type" "data",
      Aeson.constructorTagModifier = camelTo2 '_',
      Aeson.tagSingleConstructors = True
    }