{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

-- | Types and constants to describe the HTTP version.
module Network.HTTP.Types.Version (
    HttpVersion (..),
    http09,
    http10,
    http11,
    http20,
) where

import Data.Data (Data)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)

-- | HTTP Version.
--
-- Note that the 'Show' instance is intended merely for debugging.
data HttpVersion = HttpVersion
    { HttpVersion -> Int
httpMajor :: !Int
    , HttpVersion -> Int
httpMinor :: !Int
    }
    deriving
        ( HttpVersion -> HttpVersion -> Bool
(HttpVersion -> HttpVersion -> Bool)
-> (HttpVersion -> HttpVersion -> Bool) -> Eq HttpVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HttpVersion -> HttpVersion -> Bool
$c/= :: HttpVersion -> HttpVersion -> Bool
== :: HttpVersion -> HttpVersion -> Bool
$c== :: HttpVersion -> HttpVersion -> Bool
Eq
        , Eq HttpVersion
Eq HttpVersion
-> (HttpVersion -> HttpVersion -> Ordering)
-> (HttpVersion -> HttpVersion -> Bool)
-> (HttpVersion -> HttpVersion -> Bool)
-> (HttpVersion -> HttpVersion -> Bool)
-> (HttpVersion -> HttpVersion -> Bool)
-> (HttpVersion -> HttpVersion -> HttpVersion)
-> (HttpVersion -> HttpVersion -> HttpVersion)
-> Ord HttpVersion
HttpVersion -> HttpVersion -> Bool
HttpVersion -> HttpVersion -> Ordering
HttpVersion -> HttpVersion -> HttpVersion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: HttpVersion -> HttpVersion -> HttpVersion
$cmin :: HttpVersion -> HttpVersion -> HttpVersion
max :: HttpVersion -> HttpVersion -> HttpVersion
$cmax :: HttpVersion -> HttpVersion -> HttpVersion
>= :: HttpVersion -> HttpVersion -> Bool
$c>= :: HttpVersion -> HttpVersion -> Bool
> :: HttpVersion -> HttpVersion -> Bool
$c> :: HttpVersion -> HttpVersion -> Bool
<= :: HttpVersion -> HttpVersion -> Bool
$c<= :: HttpVersion -> HttpVersion -> Bool
< :: HttpVersion -> HttpVersion -> Bool
$c< :: HttpVersion -> HttpVersion -> Bool
compare :: HttpVersion -> HttpVersion -> Ordering
$ccompare :: HttpVersion -> HttpVersion -> Ordering
$cp1Ord :: Eq HttpVersion
Ord
        , Typeable
        , -- | @since 0.12.4
          Data
        , -- | @since 0.12.4
          Generic
        )

-- | >>> show http11
-- "HTTP/1.1"
instance Show HttpVersion where
    show :: HttpVersion -> String
show (HttpVersion Int
major Int
minor) = String
"HTTP/" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
major String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"." String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
minor

-- | HTTP 0.9
http09 :: HttpVersion
http09 :: HttpVersion
http09 = Int -> Int -> HttpVersion
HttpVersion Int
0 Int
9

-- | HTTP 1.0
http10 :: HttpVersion
http10 :: HttpVersion
http10 = Int -> Int -> HttpVersion
HttpVersion Int
1 Int
0

-- | HTTP 1.1
http11 :: HttpVersion
http11 :: HttpVersion
http11 = Int -> Int -> HttpVersion
HttpVersion Int
1 Int
1

-- | HTTP 2.0
--
-- @since 0.10
http20 :: HttpVersion
http20 :: HttpVersion
http20 = Int -> Int -> HttpVersion
HttpVersion Int
2 Int
0