{-# LANGUAGE PatternSynonyms #-}

module Network.HTTP3.Settings where

import Network.ByteOrder
import Network.QUIC.Internal

type H3Settings = [(H3SettingsKey,Int)]

newtype H3SettingsKey = H3SettingsKey Int deriving (H3SettingsKey -> H3SettingsKey -> Bool
(H3SettingsKey -> H3SettingsKey -> Bool)
-> (H3SettingsKey -> H3SettingsKey -> Bool) -> Eq H3SettingsKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: H3SettingsKey -> H3SettingsKey -> Bool
$c/= :: H3SettingsKey -> H3SettingsKey -> Bool
== :: H3SettingsKey -> H3SettingsKey -> Bool
$c== :: H3SettingsKey -> H3SettingsKey -> Bool
Eq, Int -> H3SettingsKey -> ShowS
[H3SettingsKey] -> ShowS
H3SettingsKey -> String
(Int -> H3SettingsKey -> ShowS)
-> (H3SettingsKey -> String)
-> ([H3SettingsKey] -> ShowS)
-> Show H3SettingsKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [H3SettingsKey] -> ShowS
$cshowList :: [H3SettingsKey] -> ShowS
show :: H3SettingsKey -> String
$cshow :: H3SettingsKey -> String
showsPrec :: Int -> H3SettingsKey -> ShowS
$cshowsPrec :: Int -> H3SettingsKey -> ShowS
Show)

pattern SettingsQpackMaxTableCapacity :: H3SettingsKey
pattern $bSettingsQpackMaxTableCapacity :: H3SettingsKey
$mSettingsQpackMaxTableCapacity :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r
SettingsQpackMaxTableCapacity  = H3SettingsKey 0x1

pattern SettingsMaxFieldSectionSize   :: H3SettingsKey
pattern $bSettingsMaxFieldSectionSize :: H3SettingsKey
$mSettingsMaxFieldSectionSize :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r
SettingsMaxFieldSectionSize    = H3SettingsKey 0x6

pattern SettingsQpackBlockedStreams   :: H3SettingsKey
pattern $bSettingsQpackBlockedStreams :: H3SettingsKey
$mSettingsQpackBlockedStreams :: forall r. H3SettingsKey -> (Void# -> r) -> (Void# -> r) -> r
SettingsQpackBlockedStreams    = H3SettingsKey 0x7

encodeH3Settings :: H3Settings -> IO ByteString
encodeH3Settings :: H3Settings -> IO ByteString
encodeH3Settings H3Settings
kvs = Int -> (WriteBuffer -> IO ()) -> IO ByteString
withWriteBuffer Int
128 ((WriteBuffer -> IO ()) -> IO ByteString)
-> (WriteBuffer -> IO ()) -> IO ByteString
forall a b. (a -> b) -> a -> b
$ \WriteBuffer
wbuf -> do
    ((H3SettingsKey, Int) -> IO ()) -> H3Settings -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (WriteBuffer -> (H3SettingsKey, Int) -> IO ()
forall a. Integral a => WriteBuffer -> (H3SettingsKey, a) -> IO ()
enc WriteBuffer
wbuf) H3Settings
kvs
  where
    enc :: WriteBuffer -> (H3SettingsKey, a) -> IO ()
enc WriteBuffer
wbuf (H3SettingsKey Int
k,a
v) = do
        WriteBuffer -> Int64 -> IO ()
encodeInt' WriteBuffer
wbuf (Int64 -> IO ()) -> Int64 -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k
        WriteBuffer -> Int64 -> IO ()
encodeInt' WriteBuffer
wbuf (Int64 -> IO ()) -> Int64 -> IO ()
forall a b. (a -> b) -> a -> b
$ a -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
v

decodeH3Settings :: ByteString -> IO H3Settings
decodeH3Settings :: ByteString -> IO H3Settings
decodeH3Settings ByteString
bs = ByteString -> (ReadBuffer -> IO H3Settings) -> IO H3Settings
forall a. ByteString -> (ReadBuffer -> IO a) -> IO a
withReadBuffer ByteString
bs ((ReadBuffer -> IO H3Settings) -> IO H3Settings)
-> (ReadBuffer -> IO H3Settings) -> IO H3Settings
forall a b. (a -> b) -> a -> b
$ \ReadBuffer
rbuf -> ReadBuffer -> (H3Settings -> H3Settings) -> IO H3Settings
forall b c.
Num b =>
ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c
loop ReadBuffer
rbuf H3Settings -> H3Settings
forall a. a -> a
id
  where
    dec :: ReadBuffer -> IO (H3SettingsKey, b)
dec ReadBuffer
rbuf = do
        H3SettingsKey
k <- Int -> H3SettingsKey
H3SettingsKey (Int -> H3SettingsKey) -> (Int64 -> Int) -> Int64 -> H3SettingsKey
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> H3SettingsKey) -> IO Int64 -> IO H3SettingsKey
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBuffer -> IO Int64
decodeInt' ReadBuffer
rbuf
        b
v <- Int64 -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> b) -> IO Int64 -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBuffer -> IO Int64
decodeInt' ReadBuffer
rbuf
        (H3SettingsKey, b) -> IO (H3SettingsKey, b)
forall (m :: * -> *) a. Monad m => a -> m a
return (H3SettingsKey
k,b
v)
    loop :: ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c
loop ReadBuffer
rbuf [(H3SettingsKey, b)] -> c
build = do
        Int
r <- ReadBuffer -> IO Int
forall a. Readable a => a -> IO Int
remainingSize ReadBuffer
rbuf
        if Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 then
            c -> IO c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> IO c) -> c -> IO c
forall a b. (a -> b) -> a -> b
$ [(H3SettingsKey, b)] -> c
build []
          else do
            (H3SettingsKey, b)
kv <- ReadBuffer -> IO (H3SettingsKey, b)
forall b. Num b => ReadBuffer -> IO (H3SettingsKey, b)
dec ReadBuffer
rbuf
            ReadBuffer -> ([(H3SettingsKey, b)] -> c) -> IO c
loop ReadBuffer
rbuf ([(H3SettingsKey, b)] -> c
build ([(H3SettingsKey, b)] -> c)
-> ([(H3SettingsKey, b)] -> [(H3SettingsKey, b)])
-> [(H3SettingsKey, b)]
-> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((H3SettingsKey, b)
kv (H3SettingsKey, b) -> [(H3SettingsKey, b)] -> [(H3SettingsKey, b)]
forall a. a -> [a] -> [a]
:))