{-# OPTIONS_HADDOCK hide #-}
-- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/3d29e8dc-218a-42c6-9ba4-947ebca9fd7e

module Database.Tds.Primitives.Collation ( Collation32 (..)
                                         , SortId (..)
                                         , Collation (..)
                                         , getCollation
                                         , putCollation
                                         ) where

import Data.Word (Word8(..),Word32(..))

import Data.Binary (Put(..),Get(..))
import qualified Data.Binary.Put as Put
import qualified Data.Binary.Get as Get


type Collation32 = Word32
type SortId = Word8

-- | [\[MS-TDS\] 2.2.5.1.2 Collation Rule Definition](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/3d29e8dc-218a-42c6-9ba4-947ebca9fd7e)
data Collation = Collation !Collation32 !SortId
               deriving (Int -> Collation -> ShowS
[Collation] -> ShowS
Collation -> String
(Int -> Collation -> ShowS)
-> (Collation -> String)
-> ([Collation] -> ShowS)
-> Show Collation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Collation -> ShowS
showsPrec :: Int -> Collation -> ShowS
$cshow :: Collation -> String
show :: Collation -> String
$cshowList :: [Collation] -> ShowS
showList :: [Collation] -> ShowS
Show)


getCollation :: Get Collation
getCollation :: Get Collation
getCollation = do
  Collation32
coll <- Get Collation32
Get.getWord32be
  SortId
sort <- Get SortId
Get.getWord8
  Collation -> Get Collation
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (Collation -> Get Collation) -> Collation -> Get Collation
forall a b. (a -> b) -> a -> b
$ Collation32 -> SortId -> Collation
Collation Collation32
coll SortId
sort

putCollation :: Collation -> Put
putCollation :: Collation -> Put
putCollation (Collation Collation32
coll SortId
sort) = do
  Collation32 -> Put
Put.putWord32be Collation32
coll
  SortId -> Put
Put.putWord8 SortId
sort