module Network.HTTP.Req.OAuth2.Internal.Types
    ( AccessToken(..)
    , App(..)
    , ClientId(..)
    , ClientPair(..)
    , ClientSecret(..)
    , OAuth2
    , ParseError(..)
    , RefreshToken(..)
    , TokenPair(..)
    , UpdateTokenPair
    ) where

import           Control.Exception (Exception)
import           Control.Monad.Trans.State.Strict (StateT)
import           Data.Text (Text)
import           Data.Typeable (Typeable)
import           Text.URI (URI)

-- | OAuth2 application monad
type OAuth2 = StateT TokenPair IO

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

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

-- | OAuth2 access token
newtype AccessToken = AccessToken Text deriving Int -> AccessToken -> ShowS
[AccessToken] -> ShowS
AccessToken -> String
(Int -> AccessToken -> ShowS)
-> (AccessToken -> String)
-> ([AccessToken] -> ShowS)
-> Show AccessToken
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AccessToken] -> ShowS
$cshowList :: [AccessToken] -> ShowS
show :: AccessToken -> String
$cshow :: AccessToken -> String
showsPrec :: Int -> AccessToken -> ShowS
$cshowsPrec :: Int -> AccessToken -> ShowS
Show

-- | OAuth2 refresh token
newtype RefreshToken = RefreshToken Text deriving Int -> RefreshToken -> ShowS
[RefreshToken] -> ShowS
RefreshToken -> String
(Int -> RefreshToken -> ShowS)
-> (RefreshToken -> String)
-> ([RefreshToken] -> ShowS)
-> Show RefreshToken
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RefreshToken] -> ShowS
$cshowList :: [RefreshToken] -> ShowS
show :: RefreshToken -> String
$cshow :: RefreshToken -> String
showsPrec :: Int -> RefreshToken -> ShowS
$cshowsPrec :: Int -> RefreshToken -> ShowS
Show

-- | OAuth2 client ID/client secret pair
data ClientPair = ClientPair ClientId ClientSecret deriving (ClientPair -> ClientPair -> Bool
(ClientPair -> ClientPair -> Bool)
-> (ClientPair -> ClientPair -> Bool) -> Eq ClientPair
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ClientPair -> ClientPair -> Bool
$c/= :: ClientPair -> ClientPair -> Bool
== :: ClientPair -> ClientPair -> Bool
$c== :: ClientPair -> ClientPair -> Bool
Eq, Int -> ClientPair -> ShowS
[ClientPair] -> ShowS
ClientPair -> String
(Int -> ClientPair -> ShowS)
-> (ClientPair -> String)
-> ([ClientPair] -> ShowS)
-> Show ClientPair
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ClientPair] -> ShowS
$cshowList :: [ClientPair] -> ShowS
show :: ClientPair -> String
$cshow :: ClientPair -> String
showsPrec :: Int -> ClientPair -> ShowS
$cshowsPrec :: Int -> ClientPair -> ShowS
Show)

-- | OAuth2 access/refresh token pair
data TokenPair = TokenPair AccessToken RefreshToken deriving Int -> TokenPair -> ShowS
[TokenPair] -> ShowS
TokenPair -> String
(Int -> TokenPair -> ShowS)
-> (TokenPair -> String)
-> ([TokenPair] -> ShowS)
-> Show TokenPair
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TokenPair] -> ShowS
$cshowList :: [TokenPair] -> ShowS
show :: TokenPair -> String
$cshow :: TokenPair -> String
showsPrec :: Int -> TokenPair -> ShowS
$cshowsPrec :: Int -> TokenPair -> ShowS
Show

-- | Action invoked in response to update to access/refresh token pair
type UpdateTokenPair = TokenPair -> IO ()

-- | A web API application
data App = App
    { App -> URI
appAuthUri :: URI
    , App -> URI
appTokenUri :: URI
    , App -> UpdateTokenPair
appUpdateTokenPair :: UpdateTokenPair
    , App -> ClientPair
appClientPair :: ClientPair
    }

-- | TODO
data ParseError = ParseError String deriving (Int -> ParseError -> ShowS
[ParseError] -> ShowS
ParseError -> String
(Int -> ParseError -> ShowS)
-> (ParseError -> String)
-> ([ParseError] -> ShowS)
-> Show ParseError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParseError] -> ShowS
$cshowList :: [ParseError] -> ShowS
show :: ParseError -> String
$cshow :: ParseError -> String
showsPrec :: Int -> ParseError -> ShowS
$cshowsPrec :: Int -> ParseError -> ShowS
Show, Typeable)
instance Exception ParseError