packages feed

postgresql-syntax-0.5.0.0: library-internal/PostgresqlSyntax/Ast/OnConflict.hs

module PostgresqlSyntax.Ast.OnConflict where

import qualified HeadedMegaparsec as Parser
import PostgresqlSyntax.Ast.ConfExpr
import PostgresqlSyntax.Ast.OnConflictDo
import qualified PostgresqlSyntax.Helpers.Gens as Gens
import qualified PostgresqlSyntax.Helpers.Parsers as Parsers
import qualified PostgresqlSyntax.Helpers.TextBuilders as TextBuilders
import PostgresqlSyntax.IsAst
import PostgresqlSyntax.Prelude
import qualified Test.QuickCheck as Qc

-- |
-- ==== References
-- @
-- opt_on_conflict:
--   | ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
--   | ON CONFLICT opt_conf_expr DO NOTHING
--   | EMPTY
-- @
data OnConflict = OnConflict (Maybe ConfExpr) OnConflictDo
  deriving (Show, Generic, Eq, Ord, Data)

instance IsAst OnConflict where
  toTextBuilder settings (OnConflict a b) = "ON CONFLICT" <> TextBuilders.suffixMaybe (toTextBuilder settings) a <> " DO " <> toTextBuilder settings b
  parser settings = do
    Parsers.keyword "on"
    Parsers.space1
    Parsers.keyword "conflict"
    Parsers.space1
    Parser.endHead
    a <- optional (parser settings <* Parsers.space1)
    Parsers.keyword "do"
    Parsers.space1
    b <- parser settings
    return (OnConflict a b)

instance Qc.Arbitrary OnConflict where
  shrink = Qc.genericShrink
  arbitrary = OnConflict <$> Gens.terminatingMaybe arbitrary <*> arbitrary