packages feed

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

module PostgresqlSyntax.Ast.WithClause where

import qualified HeadedMegaparsec as Parser
import PostgresqlSyntax.Ast.CommonTableExpr (CommonTableExpr)
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
-- @
-- with_clause:
--   |  WITH cte_list
--   |  WITH_LA cte_list
--   |  WITH RECURSIVE cte_list
-- @
data WithClause = WithClause Bool (NonEmpty CommonTableExpr)
  deriving (Show, Generic, Eq, Ord, Data)

instance IsAst WithClause where
  toTextBuilder settings (WithClause a b) =
    "WITH " <> bool "" "RECURSIVE " a <> TextBuilders.commaNonEmpty (toTextBuilder settings) b
  parser settings = Parser.label "with clause" $ do
    Parsers.keyword "with"
    Parsers.space1
    Parser.endHead
    recursive <- option False (True <$ Parsers.keyword "recursive" <* Parsers.space1)
    cteList <- Parsers.sep1 Parsers.commaSeparator (parser settings)
    return (WithClause recursive cteList)

instance Qc.Arbitrary WithClause where
  shrink = Qc.genericShrink
  arbitrary = WithClause <$> arbitrary <*> Gens.nonEmptyUpTo 6 Qc.arbitrary