module Crypto.WebAuthn.WebIDL
( DOMString,
USVString,
UnsignedLongLong,
UnsignedLong,
Long,
UnsignedShort,
Octet,
Boolean,
Crypto.WebAuthn.WebIDL.Double,
BufferSource (..),
ArrayBuffer,
)
where
import qualified Data.Aeson as Aeson
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64.URL as Base64
import Data.Int (Int32)
import Data.Text (Text)
import qualified Data.Text.Encoding as Text
import Data.Word (Word16, Word32, Word64, Word8)
type DOMString = Text
type USVString = Text
type UnsignedLong = Word32
type UnsignedLongLong = Word64
type Long = Int32
type UnsignedShort = Word16
type Octet = Word8
type Boolean = Bool
type Double = Prelude.Double
newtype BufferSource =
URLEncodedBase64 {BufferSource -> ByteString
unUrlEncodedBase64 :: BS.ByteString}
deriving (Int -> BufferSource -> ShowS
[BufferSource] -> ShowS
BufferSource -> String
(Int -> BufferSource -> ShowS)
-> (BufferSource -> String)
-> ([BufferSource] -> ShowS)
-> Show BufferSource
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BufferSource] -> ShowS
$cshowList :: [BufferSource] -> ShowS
show :: BufferSource -> String
$cshow :: BufferSource -> String
showsPrec :: Int -> BufferSource -> ShowS
$cshowsPrec :: Int -> BufferSource -> ShowS
Show, BufferSource -> BufferSource -> Bool
(BufferSource -> BufferSource -> Bool)
-> (BufferSource -> BufferSource -> Bool) -> Eq BufferSource
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BufferSource -> BufferSource -> Bool
$c/= :: BufferSource -> BufferSource -> Bool
== :: BufferSource -> BufferSource -> Bool
$c== :: BufferSource -> BufferSource -> Bool
Eq)
instance Aeson.FromJSON BufferSource where
parseJSON :: Value -> Parser BufferSource
parseJSON = String
-> (Text -> Parser BufferSource) -> Value -> Parser BufferSource
forall a. String -> (Text -> Parser a) -> Value -> Parser a
Aeson.withText String
"base64url" ((Text -> Parser BufferSource) -> Value -> Parser BufferSource)
-> (Text -> Parser BufferSource) -> Value -> Parser BufferSource
forall a b. (a -> b) -> a -> b
$ \Text
t ->
(String -> Parser BufferSource)
-> (ByteString -> Parser BufferSource)
-> Either String ByteString
-> Parser BufferSource
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Parser BufferSource
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (BufferSource -> Parser BufferSource
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BufferSource -> Parser BufferSource)
-> (ByteString -> BufferSource)
-> ByteString
-> Parser BufferSource
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BufferSource
URLEncodedBase64) (ByteString -> Either String ByteString
Base64.decode (ByteString -> Either String ByteString)
-> ByteString -> Either String ByteString
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
Text.encodeUtf8 Text
t)
instance Aeson.ToJSON BufferSource where
toJSON :: BufferSource -> Value
toJSON (URLEncodedBase64 ByteString
bs) = Text -> Value
Aeson.String (Text -> Value) -> (ByteString -> Text) -> ByteString -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
Text.decodeUtf8 (ByteString -> Text)
-> (ByteString -> ByteString) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
Base64.encodeUnpadded (ByteString -> Value) -> ByteString -> Value
forall a b. (a -> b) -> a -> b
$ ByteString
bs
type ArrayBuffer = BufferSource