module WebDriverPreCore.Internal.HTTPBidiCommon
  ( URL (..),
    JSUInt (..),
  )
where

import Data.Aeson as A
  ( FromJSON (..),
    ToJSON,
    Value (..),
    (.:),
  )
import Data.Aeson.Types (Parser)
import Data.Text (Text, unpack)
import Data.Word (Word64)
import Utils (txt)

newtype JSUInt = MkJSUInt Word64 deriving newtype (Int -> JSUInt -> ShowS
[JSUInt] -> ShowS
JSUInt -> String
(Int -> JSUInt -> ShowS)
-> (JSUInt -> String) -> ([JSUInt] -> ShowS) -> Show JSUInt
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSUInt -> ShowS
showsPrec :: Int -> JSUInt -> ShowS
$cshow :: JSUInt -> String
show :: JSUInt -> String
$cshowList :: [JSUInt] -> ShowS
showList :: [JSUInt] -> ShowS
Show, JSUInt -> JSUInt -> Bool
(JSUInt -> JSUInt -> Bool)
-> (JSUInt -> JSUInt -> Bool) -> Eq JSUInt
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSUInt -> JSUInt -> Bool
== :: JSUInt -> JSUInt -> Bool
$c/= :: JSUInt -> JSUInt -> Bool
/= :: JSUInt -> JSUInt -> Bool
Eq, Int -> JSUInt
JSUInt -> Int
JSUInt -> [JSUInt]
JSUInt -> JSUInt
JSUInt -> JSUInt -> [JSUInt]
JSUInt -> JSUInt -> JSUInt -> [JSUInt]
(JSUInt -> JSUInt)
-> (JSUInt -> JSUInt)
-> (Int -> JSUInt)
-> (JSUInt -> Int)
-> (JSUInt -> [JSUInt])
-> (JSUInt -> JSUInt -> [JSUInt])
-> (JSUInt -> JSUInt -> [JSUInt])
-> (JSUInt -> JSUInt -> JSUInt -> [JSUInt])
-> Enum JSUInt
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: JSUInt -> JSUInt
succ :: JSUInt -> JSUInt
$cpred :: JSUInt -> JSUInt
pred :: JSUInt -> JSUInt
$ctoEnum :: Int -> JSUInt
toEnum :: Int -> JSUInt
$cfromEnum :: JSUInt -> Int
fromEnum :: JSUInt -> Int
$cenumFrom :: JSUInt -> [JSUInt]
enumFrom :: JSUInt -> [JSUInt]
$cenumFromThen :: JSUInt -> JSUInt -> [JSUInt]
enumFromThen :: JSUInt -> JSUInt -> [JSUInt]
$cenumFromTo :: JSUInt -> JSUInt -> [JSUInt]
enumFromTo :: JSUInt -> JSUInt -> [JSUInt]
$cenumFromThenTo :: JSUInt -> JSUInt -> JSUInt -> [JSUInt]
enumFromThenTo :: JSUInt -> JSUInt -> JSUInt -> [JSUInt]
Enum, Maybe JSUInt
Value -> Parser [JSUInt]
Value -> Parser JSUInt
(Value -> Parser JSUInt)
-> (Value -> Parser [JSUInt]) -> Maybe JSUInt -> FromJSON JSUInt
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser JSUInt
parseJSON :: Value -> Parser JSUInt
$cparseJSONList :: Value -> Parser [JSUInt]
parseJSONList :: Value -> Parser [JSUInt]
$comittedField :: Maybe JSUInt
omittedField :: Maybe JSUInt
FromJSON, [JSUInt] -> Value
[JSUInt] -> Encoding
JSUInt -> Bool
JSUInt -> Value
JSUInt -> Encoding
(JSUInt -> Value)
-> (JSUInt -> Encoding)
-> ([JSUInt] -> Value)
-> ([JSUInt] -> Encoding)
-> (JSUInt -> Bool)
-> ToJSON JSUInt
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: JSUInt -> Value
toJSON :: JSUInt -> Value
$ctoEncoding :: JSUInt -> Encoding
toEncoding :: JSUInt -> Encoding
$ctoJSONList :: [JSUInt] -> Value
toJSONList :: [JSUInt] -> Value
$ctoEncodingList :: [JSUInt] -> Encoding
toEncodingList :: [JSUInt] -> Encoding
$comitField :: JSUInt -> Bool
omitField :: JSUInt -> Bool
ToJSON) -- JSUnit ::  0..9007199254740991  -     Word64 :: 18446744073709551615

newtype URL = MkUrl {URL -> Text
url :: Text}
  deriving newtype (Int -> URL -> ShowS
[URL] -> ShowS
URL -> String
(Int -> URL -> ShowS)
-> (URL -> String) -> ([URL] -> ShowS) -> Show URL
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> URL -> ShowS
showsPrec :: Int -> URL -> ShowS
$cshow :: URL -> String
show :: URL -> String
$cshowList :: [URL] -> ShowS
showList :: [URL] -> ShowS
Show, URL -> URL -> Bool
(URL -> URL -> Bool) -> (URL -> URL -> Bool) -> Eq URL
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: URL -> URL -> Bool
== :: URL -> URL -> Bool
$c/= :: URL -> URL -> Bool
/= :: URL -> URL -> Bool
Eq, Eq URL
Eq URL =>
(URL -> URL -> Ordering)
-> (URL -> URL -> Bool)
-> (URL -> URL -> Bool)
-> (URL -> URL -> Bool)
-> (URL -> URL -> Bool)
-> (URL -> URL -> URL)
-> (URL -> URL -> URL)
-> Ord URL
URL -> URL -> Bool
URL -> URL -> Ordering
URL -> URL -> URL
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
$ccompare :: URL -> URL -> Ordering
compare :: URL -> URL -> Ordering
$c< :: URL -> URL -> Bool
< :: URL -> URL -> Bool
$c<= :: URL -> URL -> Bool
<= :: URL -> URL -> Bool
$c> :: URL -> URL -> Bool
> :: URL -> URL -> Bool
$c>= :: URL -> URL -> Bool
>= :: URL -> URL -> Bool
$cmax :: URL -> URL -> URL
max :: URL -> URL -> URL
$cmin :: URL -> URL -> URL
min :: URL -> URL -> URL
Ord, [URL] -> Value
[URL] -> Encoding
URL -> Bool
URL -> Value
URL -> Encoding
(URL -> Value)
-> (URL -> Encoding)
-> ([URL] -> Value)
-> ([URL] -> Encoding)
-> (URL -> Bool)
-> ToJSON URL
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: URL -> Value
toJSON :: URL -> Value
$ctoEncoding :: URL -> Encoding
toEncoding :: URL -> Encoding
$ctoJSONList :: [URL] -> Value
toJSONList :: [URL] -> Value
$ctoEncodingList :: [URL] -> Encoding
toEncodingList :: [URL] -> Encoding
$comitField :: URL -> Bool
omitField :: URL -> Bool
ToJSON)

instance FromJSON URL where
  parseJSON :: Value -> Parser URL
  parseJSON :: Value -> Parser URL
parseJSON = \case
    String Text
t -> URL -> Parser URL
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (URL -> Parser URL) -> URL -> Parser URL
forall a b. (a -> b) -> a -> b
$ Text -> URL
MkUrl Text
t
    Object Object
o -> do
      url <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url"
      pure $ MkUrl url
    Value
v -> String -> Parser URL
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser URL) -> String -> Parser URL
forall a b. (a -> b) -> a -> b
$ Text -> String
unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Text
"Expected URL as String or Object with url property, got: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Value -> Text
forall a. Show a => a -> Text
txt Value
v