-- | Common options that apply to many endpoints.
module Strive.Internal.Options
  ( PaginationOptions(..)
  ) where

import Data.Default (Default, def)
import Network.HTTP.Types (QueryLike, toQuery)

-- | Options for paginating.
data PaginationOptions = PaginationOptions
  { PaginationOptions -> Integer
paginationOptions_page :: Integer
  , PaginationOptions -> Integer
paginationOptions_perPage :: Integer
  }
  deriving Int -> PaginationOptions -> ShowS
[PaginationOptions] -> ShowS
PaginationOptions -> String
(Int -> PaginationOptions -> ShowS)
-> (PaginationOptions -> String)
-> ([PaginationOptions] -> ShowS)
-> Show PaginationOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PaginationOptions] -> ShowS
$cshowList :: [PaginationOptions] -> ShowS
show :: PaginationOptions -> String
$cshow :: PaginationOptions -> String
showsPrec :: Int -> PaginationOptions -> ShowS
$cshowsPrec :: Int -> PaginationOptions -> ShowS
Show

instance Default PaginationOptions where
  def :: PaginationOptions
def = PaginationOptions :: Integer -> Integer -> PaginationOptions
PaginationOptions
    { paginationOptions_page :: Integer
paginationOptions_page = Integer
1
    , paginationOptions_perPage :: Integer
paginationOptions_perPage = Integer
200
    }

instance QueryLike PaginationOptions where
  toQuery :: PaginationOptions -> Query
toQuery PaginationOptions
options = [(String, String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"page", Integer -> String
forall a. Show a => a -> String
show (PaginationOptions -> Integer
paginationOptions_page PaginationOptions
options))
    , (String
"per_page", Integer -> String
forall a. Show a => a -> String
show (PaginationOptions -> Integer
paginationOptions_perPage PaginationOptions
options))
    ]