packages feed

poppy-codegen-1.0.0: test/Poppy/Codegen/golden/Flag.hs.golden

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE TypeApplications #-}

module Schema.Flag
  ( FlagTable (..),
    FlagRow (..),
    FlagSelect (..),
    FlagPicked (..),
    flagSelect,
    flagSelectColumns,
    parseFlagPicked,
    toFlagPicked,
    FlagCreate (..),
    FlagUpdate (..),
    flagId,
    flagActive
  )
where

import Data.Text (Text)
import Data.UUID (UUID)
import Poppy.Internal.Generated
  ( FromRow (..),
    RowParser,
    field,
    Entity (..),
    Field (..),
    PrimaryKeyType,
    ModelTable,
    Picked (..),
    picked,
    Insertable (..),
    emptyInsert,
    set,
    setMaybe,
    Updatable (..),
    emptyUpdate,
    setFieldMaybe
  )

data FlagTable = FlagTable

type instance PrimaryKeyType FlagTable = UUID

type instance ModelTable "Flag" = FlagTable

instance Entity FlagTable where
  tableName = "flag"
  primaryKey = flagId
  tableColumns = ["id", "active"]

instance Insertable FlagTable where
  type CreateInput FlagTable = FlagCreate
  toInsertBuilder input =
    setMaybe flagId input.id $
      set flagActive input.active $
      emptyInsert @FlagTable


instance Updatable FlagTable where
  type UpdateInput FlagTable = FlagUpdate
  updatedAtField = Nothing
  toUpdateBuilder input =
    setFieldMaybe flagActive input.active $
      emptyUpdate @FlagTable


data FlagRow = FlagRow
  { id :: UUID,
    active :: Bool
  }
  deriving (Show, Eq)


data FlagCreate = FlagCreate
  { id :: Maybe UUID,
    active :: Bool
  }
  deriving (Show, Eq)


data FlagUpdate = FlagUpdate
  { active :: Maybe Bool
  }
  deriving (Show, Eq)


instance FromRow FlagRow where
  fromRow = FlagRow <$> field <*> field


data FlagSelect = FlagSelect
  { id :: Bool,
    active :: Bool
  }
  deriving (Show, Eq)
data FlagPicked = FlagPicked
  { id :: UUID,
    active :: Picked Bool
  }
  deriving (Show, Eq)
flagSelect :: FlagSelect
flagSelect =
  FlagSelect
    { id = False,
      active = False
    }
flagSelectColumns :: FlagSelect -> [Text]
flagSelectColumns select_ =
  fieldColumn flagId
    : concat
      [ [fieldColumn flagActive | select_.active]
      ]
parseFlagPicked :: FlagSelect -> RowParser FlagPicked
parseFlagPicked select_ = do
  idVal <- field
  activeVal <- if select_.active then Picked <$> field else pure Skipped
  pure FlagPicked { id = idVal, active = activeVal }
toFlagPicked :: FlagSelect -> FlagRow -> FlagPicked
toFlagPicked select_ row =
  FlagPicked
    { id = row.id,
      active = picked select_.active row.active
    }


flagId :: Field FlagTable UUID
flagId = Field "id" "id"

flagActive :: Field FlagTable Bool
flagActive = Field "active" "active"