{-# LANGUAGE OverloadedStrings #-}
module Network.Greskell.WebSocket.Request.Common
( Operation (..)
, SASLMechanism (..)
, Base64 (..)
) where
import Control.Applicative (empty)
import Data.Aeson (FromJSON (..), Object, ToJSON (..), Value (String))
import Data.ByteString (ByteString)
import qualified Data.ByteString.Base64 as B64
import Data.Text (Text, unpack)
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
class Operation o where
opProcessor :: o -> Text
opName :: o -> Text
opArgs :: o -> Object
instance (Operation a, Operation b) => Operation (Either a b) where
opProcessor :: Either a b -> Text
opProcessor Either a b
e = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall o. Operation o => o -> Text
opProcessor forall o. Operation o => o -> Text
opProcessor Either a b
e
opName :: Either a b -> Text
opName Either a b
e = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall o. Operation o => o -> Text
opName forall o. Operation o => o -> Text
opName Either a b
e
opArgs :: Either a b -> Object
opArgs Either a b
e = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall o. Operation o => o -> Object
opArgs forall o. Operation o => o -> Object
opArgs Either a b
e
data SASLMechanism
= SASLPlain
| SASLGSSAPI
deriving (SASLMechanism
forall a. a -> a -> Bounded a
maxBound :: SASLMechanism
$cmaxBound :: SASLMechanism
minBound :: SASLMechanism
$cminBound :: SASLMechanism
Bounded, Int -> SASLMechanism
SASLMechanism -> Int
SASLMechanism -> [SASLMechanism]
SASLMechanism -> SASLMechanism
SASLMechanism -> SASLMechanism -> [SASLMechanism]
SASLMechanism -> SASLMechanism -> SASLMechanism -> [SASLMechanism]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: SASLMechanism -> SASLMechanism -> SASLMechanism -> [SASLMechanism]
$cenumFromThenTo :: SASLMechanism -> SASLMechanism -> SASLMechanism -> [SASLMechanism]
enumFromTo :: SASLMechanism -> SASLMechanism -> [SASLMechanism]
$cenumFromTo :: SASLMechanism -> SASLMechanism -> [SASLMechanism]
enumFromThen :: SASLMechanism -> SASLMechanism -> [SASLMechanism]
$cenumFromThen :: SASLMechanism -> SASLMechanism -> [SASLMechanism]
enumFrom :: SASLMechanism -> [SASLMechanism]
$cenumFrom :: SASLMechanism -> [SASLMechanism]
fromEnum :: SASLMechanism -> Int
$cfromEnum :: SASLMechanism -> Int
toEnum :: Int -> SASLMechanism
$ctoEnum :: Int -> SASLMechanism
pred :: SASLMechanism -> SASLMechanism
$cpred :: SASLMechanism -> SASLMechanism
succ :: SASLMechanism -> SASLMechanism
$csucc :: SASLMechanism -> SASLMechanism
Enum, SASLMechanism -> SASLMechanism -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SASLMechanism -> SASLMechanism -> Bool
$c/= :: SASLMechanism -> SASLMechanism -> Bool
== :: SASLMechanism -> SASLMechanism -> Bool
$c== :: SASLMechanism -> SASLMechanism -> Bool
Eq, Eq SASLMechanism
SASLMechanism -> SASLMechanism -> Bool
SASLMechanism -> SASLMechanism -> Ordering
SASLMechanism -> SASLMechanism -> SASLMechanism
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 :: SASLMechanism -> SASLMechanism -> SASLMechanism
$cmin :: SASLMechanism -> SASLMechanism -> SASLMechanism
max :: SASLMechanism -> SASLMechanism -> SASLMechanism
$cmax :: SASLMechanism -> SASLMechanism -> SASLMechanism
>= :: SASLMechanism -> SASLMechanism -> Bool
$c>= :: SASLMechanism -> SASLMechanism -> Bool
> :: SASLMechanism -> SASLMechanism -> Bool
$c> :: SASLMechanism -> SASLMechanism -> Bool
<= :: SASLMechanism -> SASLMechanism -> Bool
$c<= :: SASLMechanism -> SASLMechanism -> Bool
< :: SASLMechanism -> SASLMechanism -> Bool
$c< :: SASLMechanism -> SASLMechanism -> Bool
compare :: SASLMechanism -> SASLMechanism -> Ordering
$ccompare :: SASLMechanism -> SASLMechanism -> Ordering
Ord, Int -> SASLMechanism -> ShowS
[SASLMechanism] -> ShowS
SASLMechanism -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [SASLMechanism] -> ShowS
$cshowList :: [SASLMechanism] -> ShowS
show :: SASLMechanism -> [Char]
$cshow :: SASLMechanism -> [Char]
showsPrec :: Int -> SASLMechanism -> ShowS
$cshowsPrec :: Int -> SASLMechanism -> ShowS
Show)
instance ToJSON SASLMechanism where
toJSON :: SASLMechanism -> Value
toJSON = forall a. ToJSON a => a -> Value
toJSON forall b c a. (b -> c) -> (a -> b) -> a -> c
. SASLMechanism -> Text
toText
where
toText :: SASLMechanism -> Text
toText :: SASLMechanism -> Text
toText SASLMechanism
SASLPlain = Text
"PLAIN"
toText SASLMechanism
SASLGSSAPI = Text
"GSSAPI"
instance FromJSON SASLMechanism where
parseJSON :: Value -> Parser SASLMechanism
parseJSON (String Text
s) = case Text
s of
Text
"PLAIN" -> forall (m :: * -> *) a. Monad m => a -> m a
return SASLMechanism
SASLPlain
Text
"GSSAPI" -> forall (m :: * -> *) a. Monad m => a -> m a
return SASLMechanism
SASLGSSAPI
Text
_ -> forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"Unknown SASLMechanism: " forall a. [a] -> [a] -> [a]
++ Text -> [Char]
unpack Text
s)
parseJSON Value
_ = forall (f :: * -> *) a. Alternative f => f a
empty
newtype Base64
= Base64 { Base64 -> ByteString
unByte64 :: ByteString }
deriving (Base64 -> Base64 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Base64 -> Base64 -> Bool
$c/= :: Base64 -> Base64 -> Bool
== :: Base64 -> Base64 -> Bool
$c== :: Base64 -> Base64 -> Bool
Eq, Eq Base64
Base64 -> Base64 -> Bool
Base64 -> Base64 -> Ordering
Base64 -> Base64 -> Base64
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 :: Base64 -> Base64 -> Base64
$cmin :: Base64 -> Base64 -> Base64
max :: Base64 -> Base64 -> Base64
$cmax :: Base64 -> Base64 -> Base64
>= :: Base64 -> Base64 -> Bool
$c>= :: Base64 -> Base64 -> Bool
> :: Base64 -> Base64 -> Bool
$c> :: Base64 -> Base64 -> Bool
<= :: Base64 -> Base64 -> Bool
$c<= :: Base64 -> Base64 -> Bool
< :: Base64 -> Base64 -> Bool
$c< :: Base64 -> Base64 -> Bool
compare :: Base64 -> Base64 -> Ordering
$ccompare :: Base64 -> Base64 -> Ordering
Ord, Int -> Base64 -> ShowS
[Base64] -> ShowS
Base64 -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Base64] -> ShowS
$cshowList :: [Base64] -> ShowS
show :: Base64 -> [Char]
$cshow :: Base64 -> [Char]
showsPrec :: Int -> Base64 -> ShowS
$cshowsPrec :: Int -> Base64 -> ShowS
Show)
instance ToJSON Base64 where
toJSON :: Base64 -> Value
toJSON (Base64 ByteString
bs) = forall a. ToJSON a => a -> Value
toJSON forall a b. (a -> b) -> a -> b
$ ByteString -> Text
decodeUtf8 forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
B64.encode ByteString
bs
instance FromJSON Base64 where
parseJSON :: Value -> Parser Base64
parseJSON (String Text
t) = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Base64
Base64) forall a b. (a -> b) -> a -> b
$ ByteString -> Either [Char] ByteString
B64.decode forall a b. (a -> b) -> a -> b
$ Text -> ByteString
encodeUtf8 Text
t
parseJSON Value
_ = forall (f :: * -> *) a. Alternative f => f a
empty