packages feed

sqel-0.0.1.0: lib/Sqel/Data/FragType.hs

module Sqel.Data.FragType where

import Sqel.Data.Order (Order)
import Sqel.Data.Sql (Sql, sql)

data FragType =
  Where
  |
  Offset
  |
  Limit
  |
  Order Order
  |
  Custom Int Text
  deriving stock (Eq, Show, Generic)

renderWithFragKeyword :: Sql -> FragType -> Sql
renderWithFragKeyword param = \case
  Where -> [sql|where #{param}|]
  Offset -> [sql|offset #{param}|]
  Limit -> [sql|limit #{param}|]
  Order dir -> [sql|order by #{param} ##{dir}|]
  Custom _ kw -> [sql|##{kw} #{param}|]

sfragOrdinal :: FragType -> Int
sfragOrdinal = \case
  Where -> 0
  Order _ -> 1
  Limit -> 2
  Offset -> 3
  Custom i _ -> i

instance Ord FragType where
  compare =
    comparing sfragOrdinal