module Stripe.Wreq
(
get,
get',
Get (..),
post,
post',
Post (..),
delete,
delete',
Delete (..),
WreqResponse,
Response (..),
wreqResponse,
responseValue,
responseValueError,
Error (..),
UserMessage (..),
LogMessage (..),
userError,
logError,
StatusCode (..),
isSuccess,
isError,
isClientError,
isServerError,
badRequest400,
unauthorized401,
requestFailed402,
notFound404,
conflict409,
tooManyRequests429,
FormParam (..),
Session,
Network.Wreq.Session.newAPISession,
)
where
import Control.Exception qualified
import Control.Lens ((&), (.~), (<>~), (?~), (^.))
import Control.Monad ((>=>))
import Data.Aeson qualified
import Data.Aeson.Key qualified
import Data.Aeson.KeyMap qualified
import Data.Bifunctor qualified
import Data.ByteString qualified
import Data.ByteString.Lazy qualified
import Data.Semigroup qualified
import Data.String (fromString)
import Data.Text (Text)
import Data.Text qualified
import Network.Wreq (FormParam (..))
import Network.Wreq qualified
import Network.Wreq.Session (Session)
import Network.Wreq.Session qualified
import Stripe.Concepts (ApiSecretKey (..), ApiVersion (..), RequestApiVersion (..))
import Prelude hiding (userError)
newtype StatusCode = StatusCode Int deriving (StatusCode -> StatusCode -> Bool
(StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> Bool) -> Eq StatusCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: StatusCode -> StatusCode -> Bool
== :: StatusCode -> StatusCode -> Bool
$c/= :: StatusCode -> StatusCode -> Bool
/= :: StatusCode -> StatusCode -> Bool
Eq)
isSuccess :: StatusCode -> Bool
isSuccess :: StatusCode -> Bool
isSuccess (StatusCode Int
x) = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
200 Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
300
isError :: StatusCode -> Bool
isError :: StatusCode -> Bool
isError (StatusCode Int
x) = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
400 Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
600
isClientError :: StatusCode -> Bool
isClientError :: StatusCode -> Bool
isClientError (StatusCode Int
x) = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
400 Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
500
isServerError :: StatusCode -> Bool
isServerError :: StatusCode -> Bool
isServerError (StatusCode Int
x) = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
500 Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
600
badRequest400 :: StatusCode
badRequest400 :: StatusCode
badRequest400 = Int -> StatusCode
StatusCode Int
400
unauthorized401 :: StatusCode
unauthorized401 :: StatusCode
unauthorized401 = Int -> StatusCode
StatusCode Int
401
requestFailed402 :: StatusCode
requestFailed402 :: StatusCode
requestFailed402 = Int -> StatusCode
StatusCode Int
402
notFound404 :: StatusCode
notFound404 :: StatusCode
notFound404 = Int -> StatusCode
StatusCode Int
404
conflict409 :: StatusCode
conflict409 :: StatusCode
conflict409 = Int -> StatusCode
StatusCode Int
409
tooManyRequests429 :: StatusCode
tooManyRequests429 :: StatusCode
tooManyRequests429 = Int -> StatusCode
StatusCode Int
429
data Get = Get
{
Get -> [Text]
getPath :: [Text],
Get -> [(Text, Text)]
getParams :: [(Text, Text)]
}
data Post = Post
{
Post -> [Text]
postPath :: [Text],
Post -> [FormParam]
postParams :: [FormParam]
}
data Delete = Delete
{
Delete -> [Text]
deletePath :: [Text],
Delete -> [(Text, Text)]
deleteParams :: [(Text, Text)]
}
get :: Session -> ApiSecretKey -> Get -> IO WreqResponse
get :: Session -> ApiSecretKey -> Get -> IO WreqResponse
get Session
session ApiSecretKey
key Get
x = Session
-> ApiSecretKey -> RequestApiVersion -> Get -> IO WreqResponse
get' Session
session ApiSecretKey
key RequestApiVersion
DefaultApiVersion Get
x
get' :: Session -> ApiSecretKey -> RequestApiVersion -> Get -> IO WreqResponse
get' :: Session
-> ApiSecretKey -> RequestApiVersion -> Get -> IO WreqResponse
get' Session
session ApiSecretKey
key RequestApiVersion
v Get
x = Options -> Session -> String -> IO WreqResponse
Network.Wreq.Session.getWith Options
opts Session
session String
url
where
url :: String
url = [Text] -> String
makeUrl (Get -> [Text]
getPath Get
x)
opts :: Options
opts =
Options
wreqDefaults
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& (Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options
Lens' Options (Maybe Auth)
Network.Wreq.auth ((Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options)
-> Auth -> Options -> Options
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ ApiSecretKey -> Auth
auth ApiSecretKey
key
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& ([(Text, Text)] -> Identity [(Text, Text)])
-> Options -> Identity Options
Lens' Options [(Text, Text)]
Network.Wreq.params (([(Text, Text)] -> Identity [(Text, Text)])
-> Options -> Identity Options)
-> [(Text, Text)] -> Options -> Options
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Get -> [(Text, Text)]
getParams Get
x)
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& ([Header] -> Identity [Header]) -> Options -> Identity Options
Lens' Options [Header]
Network.Wreq.headers (([Header] -> Identity [Header]) -> Options -> Identity Options)
-> [Header] -> Options -> Options
forall a s t. Semigroup a => ASetter s t a a -> a -> s -> t
<>~ (RequestApiVersion -> [Header]
forall {b} {a}.
(IsString b, IsString a) =>
RequestApiVersion -> [(a, b)]
requestApiVersionHeaders RequestApiVersion
v)
post :: Session -> ApiSecretKey -> Post -> IO WreqResponse
post :: Session -> ApiSecretKey -> Post -> IO WreqResponse
post Session
session ApiSecretKey
key Post
x = Session
-> ApiSecretKey -> RequestApiVersion -> Post -> IO WreqResponse
post' Session
session ApiSecretKey
key RequestApiVersion
DefaultApiVersion Post
x
post' :: Session -> ApiSecretKey -> RequestApiVersion -> Post -> IO WreqResponse
post' :: Session
-> ApiSecretKey -> RequestApiVersion -> Post -> IO WreqResponse
post' Session
session ApiSecretKey
key RequestApiVersion
v Post
x = Options -> Session -> String -> [FormParam] -> IO WreqResponse
forall a.
Postable a =>
Options -> Session -> String -> a -> IO WreqResponse
Network.Wreq.Session.postWith Options
opts Session
session String
url [FormParam]
params
where
url :: String
url = [Text] -> String
makeUrl (Post -> [Text]
postPath Post
x)
params :: [FormParam]
params = Post -> [FormParam]
postParams Post
x
opts :: Options
opts =
Options
wreqDefaults
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& (Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options
Lens' Options (Maybe Auth)
Network.Wreq.auth ((Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options)
-> Auth -> Options -> Options
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ ApiSecretKey -> Auth
auth ApiSecretKey
key
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& ([Header] -> Identity [Header]) -> Options -> Identity Options
Lens' Options [Header]
Network.Wreq.headers (([Header] -> Identity [Header]) -> Options -> Identity Options)
-> [Header] -> Options -> Options
forall a s t. Semigroup a => ASetter s t a a -> a -> s -> t
<>~ (RequestApiVersion -> [Header]
forall {b} {a}.
(IsString b, IsString a) =>
RequestApiVersion -> [(a, b)]
requestApiVersionHeaders RequestApiVersion
v)
delete :: Session -> ApiSecretKey -> Delete -> IO WreqResponse
delete :: Session -> ApiSecretKey -> Delete -> IO WreqResponse
delete Session
session ApiSecretKey
key Delete
x = Session
-> ApiSecretKey -> RequestApiVersion -> Delete -> IO WreqResponse
delete' Session
session ApiSecretKey
key RequestApiVersion
DefaultApiVersion Delete
x
delete' :: Session -> ApiSecretKey -> RequestApiVersion -> Delete -> IO WreqResponse
delete' :: Session
-> ApiSecretKey -> RequestApiVersion -> Delete -> IO WreqResponse
delete' Session
session ApiSecretKey
key RequestApiVersion
v Delete
x = Options -> Session -> String -> IO WreqResponse
Network.Wreq.Session.deleteWith Options
opts Session
session String
url
where
url :: String
url = [Text] -> String
makeUrl (Delete -> [Text]
deletePath Delete
x)
opts :: Options
opts =
Options
wreqDefaults
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& (Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options
Lens' Options (Maybe Auth)
Network.Wreq.auth ((Maybe Auth -> Identity (Maybe Auth))
-> Options -> Identity Options)
-> Auth -> Options -> Options
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ ApiSecretKey -> Auth
auth ApiSecretKey
key
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& ([(Text, Text)] -> Identity [(Text, Text)])
-> Options -> Identity Options
Lens' Options [(Text, Text)]
Network.Wreq.params (([(Text, Text)] -> Identity [(Text, Text)])
-> Options -> Identity Options)
-> [(Text, Text)] -> Options -> Options
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (Delete -> [(Text, Text)]
deleteParams Delete
x)
Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& ([Header] -> Identity [Header]) -> Options -> Identity Options
Lens' Options [Header]
Network.Wreq.headers (([Header] -> Identity [Header]) -> Options -> Identity Options)
-> [Header] -> Options -> Options
forall a s t. Semigroup a => ASetter s t a a -> a -> s -> t
<>~ (RequestApiVersion -> [Header]
forall {b} {a}.
(IsString b, IsString a) =>
RequestApiVersion -> [(a, b)]
requestApiVersionHeaders RequestApiVersion
v)
urlBase :: Text
urlBase :: Text
urlBase = String -> Text
Data.Text.pack String
"https://api.stripe.com/v1"
makeUrl :: [Text] -> String
makeUrl :: [Text] -> String
makeUrl =
Text -> String
Data.Text.unpack
(Text -> String) -> ([Text] -> Text) -> [Text] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
Data.Text.intercalate (String -> Text
Data.Text.pack String
"/")
([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
urlBase :)
wreqDefaults :: Network.Wreq.Options
wreqDefaults :: Options
wreqDefaults = Options
Network.Wreq.defaults Options -> (Options -> Options) -> Options
forall a b. a -> (a -> b) -> b
& Options -> Options
noCheckResponse
RequestApiVersion
DefaultApiVersion = []
requestApiVersionHeaders (OverrideApiVersion ApiVersion
v) = [ApiVersion -> (a, b)
forall {b} {a}. (IsString b, IsString a) => ApiVersion -> (a, b)
apiVersionHeader ApiVersion
v]
(ApiVersion Text
v) = (a
name, b
value)
where
name :: a
name = String -> a
forall a. IsString a => String -> a
fromString String
"Stripe-Version"
value :: b
value = String -> b
forall a. IsString a => String -> a
fromString (Text -> String
Data.Text.unpack Text
v)
noCheckResponse :: Network.Wreq.Options -> Network.Wreq.Options
noCheckResponse :: Options -> Options
noCheckResponse = (Maybe ResponseChecker -> Identity (Maybe ResponseChecker))
-> Options -> Identity Options
Lens' Options (Maybe ResponseChecker)
Network.Wreq.checkResponse ((Maybe ResponseChecker -> Identity (Maybe ResponseChecker))
-> Options -> Identity Options)
-> ResponseChecker -> Options -> Options
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (\Request
_ Response BodyReader
_ -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
auth :: ApiSecretKey -> Network.Wreq.Auth
auth :: ApiSecretKey -> Auth
auth (ApiSecretKey ByteString
key) = ByteString -> ByteString -> Auth
Network.Wreq.basicAuth ByteString
key ByteString
Data.ByteString.empty
newtype UserMessage = UserMessage Text deriving (UserMessage -> UserMessage -> Bool
(UserMessage -> UserMessage -> Bool)
-> (UserMessage -> UserMessage -> Bool) -> Eq UserMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UserMessage -> UserMessage -> Bool
== :: UserMessage -> UserMessage -> Bool
$c/= :: UserMessage -> UserMessage -> Bool
/= :: UserMessage -> UserMessage -> Bool
Eq, Int -> UserMessage -> ShowS
[UserMessage] -> ShowS
UserMessage -> String
(Int -> UserMessage -> ShowS)
-> (UserMessage -> String)
-> ([UserMessage] -> ShowS)
-> Show UserMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UserMessage -> ShowS
showsPrec :: Int -> UserMessage -> ShowS
$cshow :: UserMessage -> String
show :: UserMessage -> String
$cshowList :: [UserMessage] -> ShowS
showList :: [UserMessage] -> ShowS
Show)
newtype LogMessage = LogMessage Text deriving (LogMessage -> LogMessage -> Bool
(LogMessage -> LogMessage -> Bool)
-> (LogMessage -> LogMessage -> Bool) -> Eq LogMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogMessage -> LogMessage -> Bool
== :: LogMessage -> LogMessage -> Bool
$c/= :: LogMessage -> LogMessage -> Bool
/= :: LogMessage -> LogMessage -> Bool
Eq, Int -> LogMessage -> ShowS
[LogMessage] -> ShowS
LogMessage -> String
(Int -> LogMessage -> ShowS)
-> (LogMessage -> String)
-> ([LogMessage] -> ShowS)
-> Show LogMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogMessage -> ShowS
showsPrec :: Int -> LogMessage -> ShowS
$cshow :: LogMessage -> String
show :: LogMessage -> String
$cshowList :: [LogMessage] -> ShowS
showList :: [LogMessage] -> ShowS
Show)
data Error = Error
{ Error -> [UserMessage]
userMessages :: [UserMessage],
Error -> [LogMessage]
logMessages :: [LogMessage]
}
deriving (Error -> Error -> Bool
(Error -> Error -> Bool) -> (Error -> Error -> Bool) -> Eq Error
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Error -> Error -> Bool
== :: Error -> Error -> Bool
$c/= :: Error -> Error -> Bool
/= :: Error -> Error -> Bool
Eq, Int -> Error -> ShowS
[Error] -> ShowS
Error -> String
(Int -> Error -> ShowS)
-> (Error -> String) -> ([Error] -> ShowS) -> Show Error
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Error -> ShowS
showsPrec :: Int -> Error -> ShowS
$cshow :: Error -> String
show :: Error -> String
$cshowList :: [Error] -> ShowS
showList :: [Error] -> ShowS
Show)
instance Data.Semigroup.Semigroup Error where
Error [UserMessage]
x [LogMessage]
y <> :: Error -> Error -> Error
<> Error [UserMessage]
x' [LogMessage]
y' =
[UserMessage] -> [LogMessage] -> Error
Error
([UserMessage] -> [UserMessage] -> [UserMessage]
forall a. Semigroup a => a -> a -> a
(Data.Semigroup.<>) [UserMessage]
x [UserMessage]
x')
([LogMessage] -> [LogMessage] -> [LogMessage]
forall a. Semigroup a => a -> a -> a
(Data.Semigroup.<>) [LogMessage]
y [LogMessage]
y')
instance Monoid Error where
mappend :: Error -> Error -> Error
mappend = Error -> Error -> Error
forall a. Semigroup a => a -> a -> a
(Data.Semigroup.<>)
mempty :: Error
mempty = [UserMessage] -> [LogMessage] -> Error
Error [UserMessage]
forall a. Monoid a => a
mempty [LogMessage]
forall a. Monoid a => a
mempty
instance Control.Exception.Exception Error
userError ::
Text ->
Error
userError :: Text -> Error
userError Text
x = Error {userMessages :: [UserMessage]
userMessages = [Text -> UserMessage
UserMessage Text
x], logMessages :: [LogMessage]
logMessages = []}
logError ::
Text ->
Error
logError :: Text -> Error
logError Text
x = Error {userMessages :: [UserMessage]
userMessages = [], logMessages :: [LogMessage]
logMessages = [Text -> LogMessage
LogMessage Text
x]}
type WreqResponse = Network.Wreq.Response Data.ByteString.Lazy.ByteString
data Response = Response
{
Response -> Either Text Value
responseBody :: Either Text Data.Aeson.Value,
Response -> StatusCode
responseCode :: StatusCode
}
wreqResponse :: WreqResponse -> Response
wreqResponse :: WreqResponse -> Response
wreqResponse WreqResponse
r =
Response
{ responseBody :: Either Text Value
responseBody =
WreqResponse
r WreqResponse
-> Getting ByteString WreqResponse ByteString -> ByteString
forall s a. s -> Getting a s a -> a
^. Getting ByteString WreqResponse ByteString
forall body0 body1 (f :: * -> *).
Functor f =>
(body0 -> f body1) -> Response body0 -> f (Response body1)
Network.Wreq.responseBody
ByteString
-> (ByteString -> Either String Value) -> Either String Value
forall a b. a -> (a -> b) -> b
& ByteString -> Either String Value
forall a. FromJSON a => ByteString -> Either String a
Data.Aeson.eitherDecode
Either String Value
-> (Either String Value -> Either Text Value) -> Either Text Value
forall a b. a -> (a -> b) -> b
& (String -> Text) -> Either String Value -> Either Text Value
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
Data.Bifunctor.first String -> Text
Data.Text.pack,
responseCode :: StatusCode
responseCode =
WreqResponse
r
WreqResponse -> Getting Int WreqResponse Int -> Int
forall s a. s -> Getting a s a -> a
^. (Status -> Const Int Status)
-> WreqResponse -> Const Int WreqResponse
forall body (f :: * -> *).
Functor f =>
(Status -> f Status) -> Response body -> f (Response body)
Network.Wreq.responseStatus
((Status -> Const Int Status)
-> WreqResponse -> Const Int WreqResponse)
-> ((Int -> Const Int Int) -> Status -> Const Int Status)
-> Getting Int WreqResponse Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Const Int Int) -> Status -> Const Int Status
Lens' Status Int
Network.Wreq.statusCode
Int -> (Int -> StatusCode) -> StatusCode
forall a b. a -> (a -> b) -> b
& Int -> StatusCode
StatusCode
}
responseValue :: Response -> Either Error Data.Aeson.Value
responseValue :: Response -> Either Error Value
responseValue Response
r =
case (Response -> Either Text Value
responseBody Response
r) of
Left Text
e -> Error -> Either Error Value
forall a b. a -> Either a b
Left (Text -> Error
logError Text
e)
Right Value
val ->
case StatusCode -> Bool
isSuccess (Response -> StatusCode
responseCode Response
r) of
Bool
True -> Value -> Either Error Value
forall a b. b -> Either a b
Right Value
val
Bool
False -> Error -> Either Error Value
forall a b. a -> Either a b
Left (Value -> Error
responseValueError Value
val)
responseValueError :: Data.Aeson.Value -> Error
responseValueError :: Value -> Error
responseValueError Value
val
| Bool
isCardError = (Text -> Error) -> Maybe Text -> Error
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Text -> Error
userError (Value -> Maybe Text
msg Value
val)
| Bool
otherwise = (Text -> Error) -> Maybe Text -> Error
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Text -> Error
logError (Value -> Maybe Text
msg Value
val)
where
isCardError :: Bool
isCardError = Value -> Maybe Text
typ Value
val Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text -> Maybe Text
forall a. a -> Maybe a
Just (String -> Text
Data.Text.pack String
"card_error")
msg :: Value -> Maybe Text
msg = String -> Value -> Maybe Value
aesonAttr String
"error" (Value -> Maybe Value)
-> (Value -> Maybe Text) -> Value -> Maybe Text
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> String -> Value -> Maybe Value
aesonAttr String
"message" (Value -> Maybe Value)
-> (Value -> Maybe Text) -> Value -> Maybe Text
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Value -> Maybe Text
aesonText
typ :: Value -> Maybe Text
typ = String -> Value -> Maybe Value
aesonAttr String
"error" (Value -> Maybe Value)
-> (Value -> Maybe Text) -> Value -> Maybe Text
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> String -> Value -> Maybe Value
aesonAttr String
"type" (Value -> Maybe Value)
-> (Value -> Maybe Text) -> Value -> Maybe Text
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Value -> Maybe Text
aesonText
aesonAttr :: String -> Data.Aeson.Value -> Maybe Data.Aeson.Value
aesonAttr :: String -> Value -> Maybe Value
aesonAttr String
x = Value -> Maybe Object
aesonObject (Value -> Maybe Object)
-> (Object -> Maybe Value) -> Value -> Maybe Value
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Key -> Object -> Maybe Value
forall v. Key -> KeyMap v -> Maybe v
Data.Aeson.KeyMap.lookup (String -> Key
Data.Aeson.Key.fromString String
x)
aesonObject :: Data.Aeson.Value -> Maybe Data.Aeson.Object
aesonObject :: Value -> Maybe Object
aesonObject (Data.Aeson.Object Object
x) = Object -> Maybe Object
forall a. a -> Maybe a
Just Object
x
aesonObject Value
_ = Maybe Object
forall a. Maybe a
Nothing
aesonText :: Data.Aeson.Value -> Maybe Text
aesonText :: Value -> Maybe Text
aesonText (Data.Aeson.String Text
x) = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
x
aesonText Value
_ = Maybe Text
forall a. Maybe a
Nothing