--   This Source Code Form is subject to the terms of the Mozilla Public
--   License, v. 2.0. If a copy of the MPL was not distributed with this
--   file, You can obtain one at http://mozilla.org/MPL/2.0/.

{-# OPTIONS_HADDOCK show-extensions #-}

{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MagicHash #-}

-- | Interface to C libraries 
module Libjwt.FFI.Jwt
  ( JwtIO
  , unsafePerformJwtIO
  , JwtT
  , mkJwtT
  , jwtDecode
  , jwtEncode
  , addGrant
  , addGrantBool
  , addGrantInt
  , addGrantInt64
  , addGrantsFromJson
  , jwtSetAlg
  , addHeader
  , getGrant
  , getGrantBool
  , getGrantInt
  , getGrantInt64
  , getGrantAsJson
  , jwtGetAlg
  , getHeader
  , unsafeAddGrant
  , unsafeAddGrantBool
  , unsafeAddGrantInt
  , unsafeAddGrantInt64
  , unsafeAddHeader
  , unsafeGetGrant
  , unsafeGetGrantBool
  , unsafeGetGrantInt
  , unsafeGetGrantInt64
  , unsafeGetGrantAsJson
  , unsafeGetHeader
  , JsonToken(..)
  , unsafeMapTokenizedJsonArray
  )
where

import           Libjwt.FFI.Libjwt
import           Libjwt.FFI.Jsmn

import           Control.Exception              ( throwIO )
import           Control.Monad                  ( void
                                                , (<=<)
                                                )

import           Control.Monad.Catch            ( MonadCatch
                                                , MonadThrow
                                                )

import           Control.Monad.Extra            ( whenMaybe
                                                , loopM
                                                )

import           Control.Monad.Trans.State.Strict
import           Control.Monad.Trans.Class      ( lift )

import           Data.ByteString                ( ByteString
                                                , useAsCString
                                                , packCString
                                                , packCStringLen
                                                , null
                                                )
import           Data.ByteString.Unsafe         ( unsafePackMallocCString
                                                , unsafeUseAsCStringLen
                                                )

import           Foreign                 hiding ( void )
import           Foreign.C.Types
import           Foreign.C.String
import           Foreign.C.Error

import           GHC.Base                       ( unpackCString# )
import           GHC.Exts

import           System.IO.Unsafe               ( unsafePerformIO )

import           Prelude                 hiding ( null )

-- | IO restricted to calling /libjwt/ and /jsmn/
newtype JwtIO a = JIO (IO a)
 deriving newtype (a -> JwtIO b -> JwtIO a
(a -> b) -> JwtIO a -> JwtIO b
(forall a b. (a -> b) -> JwtIO a -> JwtIO b)
-> (forall a b. a -> JwtIO b -> JwtIO a) -> Functor JwtIO
forall a b. a -> JwtIO b -> JwtIO a
forall a b. (a -> b) -> JwtIO a -> JwtIO b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> JwtIO b -> JwtIO a
$c<$ :: forall a b. a -> JwtIO b -> JwtIO a
fmap :: (a -> b) -> JwtIO a -> JwtIO b
$cfmap :: forall a b. (a -> b) -> JwtIO a -> JwtIO b
Functor, Functor JwtIO
a -> JwtIO a
Functor JwtIO
-> (forall a. a -> JwtIO a)
-> (forall a b. JwtIO (a -> b) -> JwtIO a -> JwtIO b)
-> (forall a b c. (a -> b -> c) -> JwtIO a -> JwtIO b -> JwtIO c)
-> (forall a b. JwtIO a -> JwtIO b -> JwtIO b)
-> (forall a b. JwtIO a -> JwtIO b -> JwtIO a)
-> Applicative JwtIO
JwtIO a -> JwtIO b -> JwtIO b
JwtIO a -> JwtIO b -> JwtIO a
JwtIO (a -> b) -> JwtIO a -> JwtIO b
(a -> b -> c) -> JwtIO a -> JwtIO b -> JwtIO c
forall a. a -> JwtIO a
forall a b. JwtIO a -> JwtIO b -> JwtIO a
forall a b. JwtIO a -> JwtIO b -> JwtIO b
forall a b. JwtIO (a -> b) -> JwtIO a -> JwtIO b
forall a b c. (a -> b -> c) -> JwtIO a -> JwtIO b -> JwtIO c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: JwtIO a -> JwtIO b -> JwtIO a
$c<* :: forall a b. JwtIO a -> JwtIO b -> JwtIO a
*> :: JwtIO a -> JwtIO b -> JwtIO b
$c*> :: forall a b. JwtIO a -> JwtIO b -> JwtIO b
liftA2 :: (a -> b -> c) -> JwtIO a -> JwtIO b -> JwtIO c
$cliftA2 :: forall a b c. (a -> b -> c) -> JwtIO a -> JwtIO b -> JwtIO c
<*> :: JwtIO (a -> b) -> JwtIO a -> JwtIO b
$c<*> :: forall a b. JwtIO (a -> b) -> JwtIO a -> JwtIO b
pure :: a -> JwtIO a
$cpure :: forall a. a -> JwtIO a
$cp1Applicative :: Functor JwtIO
Applicative, Applicative JwtIO
a -> JwtIO a
Applicative JwtIO
-> (forall a b. JwtIO a -> (a -> JwtIO b) -> JwtIO b)
-> (forall a b. JwtIO a -> JwtIO b -> JwtIO b)
-> (forall a. a -> JwtIO a)
-> Monad JwtIO
JwtIO a -> (a -> JwtIO b) -> JwtIO b
JwtIO a -> JwtIO b -> JwtIO b
forall a. a -> JwtIO a
forall a b. JwtIO a -> JwtIO b -> JwtIO b
forall a b. JwtIO a -> (a -> JwtIO b) -> JwtIO b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> JwtIO a
$creturn :: forall a. a -> JwtIO a
>> :: JwtIO a -> JwtIO b -> JwtIO b
$c>> :: forall a b. JwtIO a -> JwtIO b -> JwtIO b
>>= :: JwtIO a -> (a -> JwtIO b) -> JwtIO b
$c>>= :: forall a b. JwtIO a -> (a -> JwtIO b) -> JwtIO b
$cp1Monad :: Applicative JwtIO
Monad, Monad JwtIO
e -> JwtIO a
Monad JwtIO
-> (forall e a. Exception e => e -> JwtIO a) -> MonadThrow JwtIO
forall e a. Exception e => e -> JwtIO a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> JwtIO a
$cthrowM :: forall e a. Exception e => e -> JwtIO a
$cp1MonadThrow :: Monad JwtIO
MonadThrow, MonadThrow JwtIO
MonadThrow JwtIO
-> (forall e a.
    Exception e =>
    JwtIO a -> (e -> JwtIO a) -> JwtIO a)
-> MonadCatch JwtIO
JwtIO a -> (e -> JwtIO a) -> JwtIO a
forall e a. Exception e => JwtIO a -> (e -> JwtIO a) -> JwtIO a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: JwtIO a -> (e -> JwtIO a) -> JwtIO a
$ccatch :: forall e a. Exception e => JwtIO a -> (e -> JwtIO a) -> JwtIO a
$cp1MonadCatch :: MonadThrow JwtIO
MonadCatch)

-- | Wrapped pointer to /jwt_t/ with managed lifetime
newtype JwtT = JwtT (ForeignPtr JwtT)

unsafePerformJwtIO :: JwtIO a -> a
unsafePerformJwtIO :: JwtIO a -> a
unsafePerformJwtIO (JIO IO a
io) = IO a -> a
forall a. IO a -> a
unsafePerformIO IO a
io

mkJwtT :: JwtIO JwtT
mkJwtT :: JwtIO JwtT
mkJwtT = IO JwtT -> JwtIO JwtT
forall a. IO a -> JwtIO a
JIO (IO JwtT -> JwtIO JwtT) -> IO JwtT -> JwtIO JwtT
forall a b. (a -> b) -> a -> b
$ String -> (Ptr PJwtT -> IO CInt) -> IO JwtT
mkJwtT_ String
"jwt_new" Ptr PJwtT -> IO CInt
c_jwt_new

jwtDecode :: ByteString -> ByteString -> JwtIO JwtT
jwtDecode :: ByteString -> ByteString -> JwtIO JwtT
jwtDecode ByteString
key ByteString
token = IO JwtT -> JwtIO JwtT
forall a. IO a -> JwtIO a
JIO
  (IO JwtT -> JwtIO JwtT) -> IO JwtT -> JwtIO JwtT
forall a b. (a -> b) -> a -> b
$ (if ByteString -> Bool
null ByteString
key then (((Ptr CChar, Int) -> IO JwtT) -> (Ptr CChar, Int) -> IO JwtT
forall a b. (a -> b) -> a -> b
$ (Ptr CChar
forall a. Ptr a
nullPtr, Int
0)) else ByteString -> ((Ptr CChar, Int) -> IO JwtT) -> IO JwtT
forall a. ByteString -> ((Ptr CChar, Int) -> IO a) -> IO a
unsafeUseAsCStringLen ByteString
key) (Ptr CChar, Int) -> IO JwtT
forall a. Integral a => (Ptr CChar, a) -> IO JwtT
doDecode
 where
  doDecode :: (Ptr CChar, a) -> IO JwtT
doDecode (Ptr CChar
p_key, a
key_len) = ByteString -> (Ptr CChar -> IO JwtT) -> IO JwtT
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
token ((Ptr CChar -> IO JwtT) -> IO JwtT)
-> (Ptr CChar -> IO JwtT) -> IO JwtT
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_token ->
    String -> (Ptr PJwtT -> IO CInt) -> IO JwtT
mkJwtT_ String
"jwt_decode"
      ((Ptr PJwtT -> IO CInt) -> IO JwtT)
-> (Ptr PJwtT -> IO CInt) -> IO JwtT
forall a b. (a -> b) -> a -> b
$ \Ptr PJwtT
ret -> Ptr PJwtT -> Ptr CChar -> Ptr CChar -> CInt -> IO CInt
c_jwt_decode Ptr PJwtT
ret Ptr CChar
p_token Ptr CChar
p_key (CInt -> IO CInt) -> CInt -> IO CInt
forall a b. (a -> b) -> a -> b
$ a -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
key_len

mkJwtT_ :: String -> (Ptr PJwtT -> IO CInt) -> IO JwtT
mkJwtT_ :: String -> (Ptr PJwtT -> IO CInt) -> IO JwtT
mkJwtT_ String
loc Ptr PJwtT -> IO CInt
ctr = (Ptr PJwtT -> IO JwtT) -> IO JwtT
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr PJwtT -> IO JwtT) -> IO JwtT)
-> (Ptr PJwtT -> IO JwtT) -> IO JwtT
forall a b. (a -> b) -> a -> b
$ \Ptr PJwtT
ptr -> do
  CInt
res <- Ptr PJwtT -> IO CInt
ctr Ptr PJwtT
ptr
  if CInt
res CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
0 then PJwtT -> IO JwtT
wrapJwtPtr (PJwtT -> IO JwtT) -> IO PJwtT -> IO JwtT
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr PJwtT -> IO PJwtT
forall a. Storable a => Ptr a -> IO a
peek Ptr PJwtT
ptr else String -> Errno -> IO JwtT
forall a. String -> Errno -> IO a
throwLibjwt String
loc (Errno -> IO JwtT) -> Errno -> IO JwtT
forall a b. (a -> b) -> a -> b
$ CInt -> Errno
Errno CInt
res

type PJwtT = Ptr JwtT

{-# RULES
"addGrant/unsafeAddGrant" forall s . addGrant (unpackCString# s) = unsafeAddGrant s
"addGrantBool/unsafeAddGrantBool" forall s . addGrantBool (unpackCString# s) = unsafeAddGrantBool s
"addGrantInt64/unsafeAddGrantInt64" forall s . addGrantInt64 (unpackCString# s) = unsafeAddGrantInt64 s
"addGrantInt/unsafeAddGrantInt" forall s . addGrantInt (unpackCString# s) = unsafeAddGrantInt s
"addHeader/unsafeAddHeader" forall s . addHeader (unpackCString# s) = unsafeAddHeader s #-}

{-# INLINE [0] addGrant #-}
{-# INLINE [0] addGrantBool #-}
{-# INLINE [0] addGrantInt64 #-}
{-# INLINE [0] addGrantInt #-}
{-# INLINE [0] addHeader #-}

addGrant :: String -> ByteString -> JwtT -> JwtIO ()
addGrant :: String -> ByteString -> JwtT -> JwtIO ()
addGrant String
grant ByteString
val JwtT
jwt = IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
val ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_val ->
  String
-> (PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt)
-> String
-> Ptr CChar
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> String
-> p
-> JwtT
-> IO ()
_addGrant String
"jwt_add_grant" PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt
c_jwt_add_grant String
grant Ptr CChar
p_val JwtT
jwt

unsafeAddGrant :: Addr# -> ByteString -> JwtT -> JwtIO ()
unsafeAddGrant :: Addr# -> ByteString -> JwtT -> JwtIO ()
unsafeAddGrant Addr#
p_grant ByteString
val JwtT
jwt = IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
val ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_val ->
  String
-> (PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt)
-> Addr#
-> Ptr CChar
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> Addr#
-> p
-> JwtT
-> IO ()
_unsafeAddGrant String
"jwt_add_grant" PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt
c_jwt_add_grant Addr#
p_grant Ptr CChar
p_val JwtT
jwt

addGrantBool :: String -> Bool -> JwtT -> JwtIO ()
addGrantBool :: String -> Bool -> JwtT -> JwtIO ()
addGrantBool String
grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Bool -> JwtT -> IO ()) -> Bool -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CInt -> IO CInt)
-> String
-> CInt
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> String
-> p
-> JwtT
-> IO ()
_addGrant String
"jwt_add_grant_bool" PJwtT -> Ptr CChar -> CInt -> IO CInt
c_jwt_add_grant_bool String
grant (CInt -> JwtT -> IO ()) -> (Bool -> CInt) -> Bool -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> CInt
forall a. Num a => Bool -> a
fromBool

unsafeAddGrantBool :: Addr# -> Bool -> JwtT -> JwtIO ()
unsafeAddGrantBool :: Addr# -> Bool -> JwtT -> JwtIO ()
unsafeAddGrantBool Addr#
p_grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce
    ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Bool -> JwtT -> IO ()) -> Bool -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CInt -> IO CInt)
-> Addr#
-> CInt
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> Addr#
-> p
-> JwtT
-> IO ()
_unsafeAddGrant String
"jwt_add_grant_bool" PJwtT -> Ptr CChar -> CInt -> IO CInt
c_jwt_add_grant_bool Addr#
p_grant
    (CInt -> JwtT -> IO ()) -> (Bool -> CInt) -> Bool -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> CInt
forall a. Num a => Bool -> a
fromBool

addGrantInt64 :: String -> Int64 -> JwtT -> JwtIO ()
addGrantInt64 :: String -> Int64 -> JwtT -> JwtIO ()
addGrantInt64 String
grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Int64 -> JwtT -> IO ()) -> Int64 -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CLong -> IO CInt)
-> String
-> CLong
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> String
-> p
-> JwtT
-> IO ()
_addGrant String
"jwt_add_grant_int" PJwtT -> Ptr CChar -> CLong -> IO CInt
c_jwt_add_grant_int String
grant (CLong -> JwtT -> IO ())
-> (Int64 -> CLong) -> Int64 -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> CLong
coerce

unsafeAddGrantInt64 :: Addr# -> Int64 -> JwtT -> JwtIO ()
unsafeAddGrantInt64 :: Addr# -> Int64 -> JwtT -> JwtIO ()
unsafeAddGrantInt64 Addr#
p_grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce
    ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Int64 -> JwtT -> IO ()) -> Int64 -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CLong -> IO CInt)
-> Addr#
-> CLong
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> Addr#
-> p
-> JwtT
-> IO ()
_unsafeAddGrant String
"jwt_add_grant_int" PJwtT -> Ptr CChar -> CLong -> IO CInt
c_jwt_add_grant_int Addr#
p_grant
    (CLong -> JwtT -> IO ())
-> (Int64 -> CLong) -> Int64 -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> CLong
coerce

addGrantInt :: String -> Int -> JwtT -> JwtIO ()
addGrantInt :: String -> Int -> JwtT -> JwtIO ()
addGrantInt String
grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce
    ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Int -> JwtT -> IO ()) -> Int -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CLong -> IO CInt)
-> String
-> CLong
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> String
-> p
-> JwtT
-> IO ()
_addGrant String
"jwt_add_grant_int" PJwtT -> Ptr CChar -> CLong -> IO CInt
c_jwt_add_grant_int String
grant
    (CLong -> JwtT -> IO ()) -> (Int -> CLong) -> Int -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral

unsafeAddGrantInt :: Addr# -> Int -> JwtT -> JwtIO ()
unsafeAddGrantInt :: Addr# -> Int -> JwtT -> JwtIO ()
unsafeAddGrantInt Addr#
p_grant =
  (JwtT -> IO ()) -> JwtT -> JwtIO ()
coerce
    ((JwtT -> IO ()) -> JwtT -> JwtIO ())
-> (Int -> JwtT -> IO ()) -> Int -> JwtT -> JwtIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> (PJwtT -> Ptr CChar -> CLong -> IO CInt)
-> Addr#
-> CLong
-> JwtT
-> IO ()
forall p.
String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> Addr#
-> p
-> JwtT
-> IO ()
_unsafeAddGrant String
"jwt_add_grant_int" PJwtT -> Ptr CChar -> CLong -> IO CInt
c_jwt_add_grant_int Addr#
p_grant
    (CLong -> JwtT -> IO ()) -> (Int -> CLong) -> Int -> JwtT -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral

_addGrant
  :: String
  -> (PJwtT -> CString -> p -> IO CInt)
  -> String
  -> p
  -> JwtT
  -> IO ()
_addGrant :: String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> String
-> p
-> JwtT
-> IO ()
_addGrant String
loc PJwtT -> Ptr CChar -> p -> IO CInt
f String
grant p
val (JwtT ForeignPtr JwtT
pjwt_t) = ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String -> (Ptr CChar -> IO ()) -> IO ()
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_grant -> String -> IO CInt -> IO ()
throwIfNonZero_ String
loc (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> p -> IO CInt
f PJwtT
jwt Ptr CChar
p_grant p
val

_unsafeAddGrant
  :: String -> (PJwtT -> CString -> p -> IO CInt) -> Addr# -> p -> JwtT -> IO ()
_unsafeAddGrant :: String
-> (PJwtT -> Ptr CChar -> p -> IO CInt)
-> Addr#
-> p
-> JwtT
-> IO ()
_unsafeAddGrant String
loc PJwtT -> Ptr CChar -> p -> IO CInt
f Addr#
p_grant p
val (JwtT ForeignPtr JwtT
pjwt_t) =
  ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt -> String -> IO CInt -> IO ()
throwIfNonZero_ String
loc (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> p -> IO CInt
f PJwtT
jwt (Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant) p
val

addGrantsFromJson :: ByteString -> JwtT -> JwtIO ()
addGrantsFromJson :: ByteString -> JwtT -> JwtIO ()
addGrantsFromJson ByteString
json (JwtT ForeignPtr JwtT
pjwt_t) = IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
json
    ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IO CInt -> IO ()
throwIfNonZero_ String
"jwt_add_grants_json"
    (IO CInt -> IO ()) -> (Ptr CChar -> IO CInt) -> Ptr CChar -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CInt
c_jwt_add_grants_json PJwtT
jwt

jwtSetAlg :: JwtAlgT -> ByteString -> JwtT -> JwtIO ()
jwtSetAlg :: JwtAlgT -> ByteString -> JwtT -> JwtIO ()
jwtSetAlg JwtAlgT
alg ByteString
key (JwtT ForeignPtr JwtT
pjwt_t) = IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  if JwtAlgT
alg JwtAlgT -> JwtAlgT -> Bool
forall a. Eq a => a -> a -> Bool
== JwtAlgT
jwtAlgNone
    then IO CInt -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> JwtAlgT -> Ptr CChar -> CInt -> IO CInt
c_jwt_set_alg PJwtT
jwt JwtAlgT
jwtAlgNone Ptr CChar
forall a. Ptr a
nullPtr CInt
0
    else ByteString -> ((Ptr CChar, Int) -> IO ()) -> IO ()
forall a. ByteString -> ((Ptr CChar, Int) -> IO a) -> IO a
unsafeUseAsCStringLen ByteString
key (((Ptr CChar, Int) -> IO ()) -> IO ())
-> ((Ptr CChar, Int) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr CChar
p_key, Int
keylen) ->
      String -> IO CInt -> IO ()
throwIfNonZero_ String
"jwt_set_alg" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> JwtAlgT -> Ptr CChar -> CInt -> IO CInt
c_jwt_set_alg PJwtT
jwt JwtAlgT
alg Ptr CChar
p_key (CInt -> IO CInt) -> CInt -> IO CInt
forall a b. (a -> b) -> a -> b
$ Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral
        Int
keylen

addHeader :: String -> ByteString -> JwtT -> JwtIO ()
addHeader :: String -> ByteString -> JwtT -> JwtIO ()
addHeader String
h ByteString
val (JwtT ForeignPtr JwtT
pjwt_t) =
  IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
val ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_val -> ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
    String -> (Ptr CChar -> IO ()) -> IO ()
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
h ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
ph ->
      String -> IO CInt -> IO ()
throwIfNonZero_ String
"jwt_add_header" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt
c_jwt_add_header PJwtT
jwt Ptr CChar
ph Ptr CChar
p_val

unsafeAddHeader :: Addr# -> ByteString -> JwtT -> JwtIO ()
unsafeAddHeader :: Addr# -> ByteString -> JwtT -> JwtIO ()
unsafeAddHeader Addr#
p_header ByteString
val (JwtT ForeignPtr JwtT
pjwt_t) =
  IO () -> JwtIO ()
forall a. IO a -> JwtIO a
JIO (IO () -> JwtIO ()) -> IO () -> JwtIO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
val ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
p_val -> ForeignPtr JwtT -> (PJwtT -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO ()) -> IO ()) -> (PJwtT -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
    String -> IO CInt -> IO ()
throwIfNonZero_ String
"jwt_add_header" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> Ptr CChar -> IO CInt
c_jwt_add_header PJwtT
jwt (Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_header) Ptr CChar
p_val

jwtEncode :: JwtT -> JwtIO ByteString
jwtEncode :: JwtT -> JwtIO ByteString
jwtEncode (JwtT ForeignPtr JwtT
pjwt_t) =
  IO ByteString -> JwtIO ByteString
forall a. IO a -> JwtIO a
JIO
    (IO ByteString -> JwtIO ByteString)
-> IO ByteString -> JwtIO ByteString
forall a b. (a -> b) -> a -> b
$   ForeignPtr JwtT -> (PJwtT -> IO ByteString) -> IO ByteString
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t
    ((PJwtT -> IO ByteString) -> IO ByteString)
-> (PJwtT -> IO ByteString) -> IO ByteString
forall a b. (a -> b) -> a -> b
$   Ptr CChar -> IO ByteString
unsafePackMallocCString
    (Ptr CChar -> IO ByteString)
-> (PJwtT -> IO (Ptr CChar)) -> PJwtT -> IO ByteString
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< String -> IO (Ptr CChar) -> IO (Ptr CChar)
forall a. String -> IO (Ptr a) -> IO (Ptr a)
throwErrnoIfNull String
"jwt_encode_str"
    (IO (Ptr CChar) -> IO (Ptr CChar))
-> (PJwtT -> IO (Ptr CChar)) -> PJwtT -> IO (Ptr CChar)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.   PJwtT -> IO (Ptr CChar)
c_jwt_encode_str

{-# RULES
"getGrant/unsafeGetGrant" forall s . getGrant (unpackCString# s) = unsafeGetGrant s
"getGrantBool/unsafeGetGrantBool" forall s . getGrantBool (unpackCString# s) = unsafeGetGrantBool s
"getGrantInt64/unsafeGetGrantInt64" forall s . getGrantInt64 (unpackCString# s) = unsafeGetGrantInt64 s
"getGrantInt/unsafeGetGrantInt" forall s . getGrantInt (unpackCString# s) = unsafeGetGrantInt s
"getGrantAsJson/unsafeGetGrantAsJson" forall s . getGrantAsJson (unpackCString# s) = unsafeGetGrantAsJson s
"getHeader/unsafeGetHeader" forall s . getHeader (unpackCString# s) = unsafeGetHeader s #-}

{-# INLINE [0] getGrant #-}
{-# INLINE [0] getGrantBool #-}
{-# INLINE [0] getGrantInt64 #-}
{-# INLINE [0] getGrantInt #-}
{-# INLINE [0] getGrantAsJson #-}
{-# INLINE [0] getHeader #-}

getGrant :: String -> JwtT -> JwtIO (Maybe ByteString)
getGrant :: String -> JwtT -> JwtIO (Maybe ByteString)
getGrant String
grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant ((Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ (Ptr CChar -> IO ByteString)
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr CChar -> IO ByteString
packCString (IO (Ptr CChar) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Ptr CChar))
-> Ptr CChar
-> IO (Maybe ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_grant PJwtT
jwt

unsafeGetGrant :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetGrant :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetGrant Addr#
p_grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  (Ptr CChar -> IO ByteString)
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr CChar -> IO ByteString
packCString (IO (Ptr CChar) -> IO (Maybe ByteString))
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_grant PJwtT
jwt (Ptr CChar -> IO (Ptr CChar)) -> Ptr CChar -> IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant

getGrantBool :: String -> JwtT -> JwtIO (Maybe Bool)
getGrantBool :: String -> JwtT -> JwtIO (Maybe Bool)
getGrantBool String
grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe Bool) -> JwtIO (Maybe Bool)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Bool) -> JwtIO (Maybe Bool))
-> IO (Maybe Bool) -> JwtIO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool))
-> (PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String -> (Ptr CChar -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant
    ((Ptr CChar -> IO (Maybe Bool)) -> IO (Maybe Bool))
-> (Ptr CChar -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ String -> IO Bool -> IO (Maybe Bool)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_bool"
    (IO Bool -> IO (Maybe Bool))
-> (Ptr CChar -> IO Bool) -> Ptr CChar -> IO (Maybe Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CInt -> Bool) -> IO CInt -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool
    (IO CInt -> IO Bool)
-> (Ptr CChar -> IO CInt) -> Ptr CChar -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CInt
c_jwt_get_grant_bool PJwtT
jwt

unsafeGetGrantBool :: Addr# -> JwtT -> JwtIO (Maybe Bool)
unsafeGetGrantBool :: Addr# -> JwtT -> JwtIO (Maybe Bool)
unsafeGetGrantBool Addr#
p_grant (JwtT ForeignPtr JwtT
pjwt_t) =
  IO (Maybe Bool) -> JwtIO (Maybe Bool)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Bool) -> JwtIO (Maybe Bool))
-> IO (Maybe Bool) -> JwtIO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool))
-> (PJwtT -> IO (Maybe Bool)) -> IO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
    String -> IO Bool -> IO (Maybe Bool)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_bool"
      (IO Bool -> IO (Maybe Bool))
-> (Ptr CChar -> IO Bool) -> Ptr CChar -> IO (Maybe Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CInt -> Bool) -> IO CInt -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool
      (IO CInt -> IO Bool)
-> (Ptr CChar -> IO CInt) -> Ptr CChar -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CInt
c_jwt_get_grant_bool PJwtT
jwt
      (Ptr CChar -> IO (Maybe Bool)) -> Ptr CChar -> IO (Maybe Bool)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant

getGrantInt64 :: String -> JwtT -> JwtIO (Maybe Int64)
getGrantInt64 :: String -> JwtT -> JwtIO (Maybe Int64)
getGrantInt64 String
grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe Int64) -> JwtIO (Maybe Int64)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Int64) -> JwtIO (Maybe Int64))
-> IO (Maybe Int64) -> JwtIO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64))
-> (PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String -> (Ptr CChar -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant
    ((Ptr CChar -> IO (Maybe Int64)) -> IO (Maybe Int64))
-> (Ptr CChar -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ IO (Maybe CLong) -> IO (Maybe Int64)
coerce
    (IO (Maybe CLong) -> IO (Maybe Int64))
-> (Ptr CChar -> IO (Maybe CLong)) -> Ptr CChar -> IO (Maybe Int64)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO CLong -> IO (Maybe CLong)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_int"
    (IO CLong -> IO (Maybe CLong))
-> (Ptr CChar -> IO CLong) -> Ptr CChar -> IO (Maybe CLong)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CLong
c_jwt_get_grant_int PJwtT
jwt

unsafeGetGrantInt64 :: Addr# -> JwtT -> JwtIO (Maybe Int64)
unsafeGetGrantInt64 :: Addr# -> JwtT -> JwtIO (Maybe Int64)
unsafeGetGrantInt64 Addr#
p_grant (JwtT ForeignPtr JwtT
pjwt_t) =
  IO (Maybe Int64) -> JwtIO (Maybe Int64)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Int64) -> JwtIO (Maybe Int64))
-> IO (Maybe Int64) -> JwtIO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64))
-> (PJwtT -> IO (Maybe Int64)) -> IO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
    IO (Maybe CLong) -> IO (Maybe Int64)
coerce
      (IO (Maybe CLong) -> IO (Maybe Int64))
-> (Ptr CChar -> IO (Maybe CLong)) -> Ptr CChar -> IO (Maybe Int64)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO CLong -> IO (Maybe CLong)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_int"
      (IO CLong -> IO (Maybe CLong))
-> (Ptr CChar -> IO CLong) -> Ptr CChar -> IO (Maybe CLong)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CLong
c_jwt_get_grant_int PJwtT
jwt
      (Ptr CChar -> IO (Maybe Int64)) -> Ptr CChar -> IO (Maybe Int64)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant


getGrantInt :: String -> JwtT -> JwtIO (Maybe Int)
getGrantInt :: String -> JwtT -> JwtIO (Maybe Int)
getGrantInt String
grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe Int) -> JwtIO (Maybe Int)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Int) -> JwtIO (Maybe Int))
-> IO (Maybe Int) -> JwtIO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Int)) -> IO (Maybe Int))
-> (PJwtT -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String -> (Ptr CChar -> IO (Maybe Int)) -> IO (Maybe Int)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant
    ((Ptr CChar -> IO (Maybe Int)) -> IO (Maybe Int))
-> (Ptr CChar -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ String -> IO Int -> IO (Maybe Int)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_int"
    (IO Int -> IO (Maybe Int))
-> (Ptr CChar -> IO Int) -> Ptr CChar -> IO (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CLong -> Int) -> IO CLong -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: CLong -> Int)
    (IO CLong -> IO Int)
-> (Ptr CChar -> IO CLong) -> Ptr CChar -> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CLong
c_jwt_get_grant_int PJwtT
jwt

unsafeGetGrantInt :: Addr# -> JwtT -> JwtIO (Maybe Int)
unsafeGetGrantInt :: Addr# -> JwtT -> JwtIO (Maybe Int)
unsafeGetGrantInt Addr#
p_grant (JwtT ForeignPtr JwtT
pjwt_t) =
  IO (Maybe Int) -> JwtIO (Maybe Int)
forall a. IO a -> JwtIO a
JIO (IO (Maybe Int) -> JwtIO (Maybe Int))
-> IO (Maybe Int) -> JwtIO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe Int)) -> IO (Maybe Int))
-> (PJwtT -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
    String -> IO Int -> IO (Maybe Int)
forall a. String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
"jwt_get_grant_int"
      (IO Int -> IO (Maybe Int))
-> (Ptr CChar -> IO Int) -> Ptr CChar -> IO (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CLong -> Int) -> IO CLong -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: CLong -> Int)
      (IO CLong -> IO Int)
-> (Ptr CChar -> IO CLong) -> Ptr CChar -> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO CLong
c_jwt_get_grant_int PJwtT
jwt
      (Ptr CChar -> IO (Maybe Int)) -> Ptr CChar -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant

getGrantAsJson :: String -> JwtT -> JwtIO (Maybe ByteString)
getGrantAsJson :: String -> JwtT -> JwtIO (Maybe ByteString)
getGrantAsJson String
grant (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
grant
    ((Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ (Ptr CChar -> IO ByteString)
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr CChar -> IO ByteString
unsafePackMallocCString
    (IO (Ptr CChar) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Ptr CChar))
-> Ptr CChar
-> IO (Maybe ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_grants_json PJwtT
jwt

unsafeGetGrantAsJson :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetGrantAsJson :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetGrantAsJson Addr#
p_grant (JwtT ForeignPtr JwtT
pjwt_t) =
  IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt -> do
    Ptr CChar
val <- PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_grants_json PJwtT
jwt (Ptr CChar -> IO (Ptr CChar)) -> Ptr CChar -> IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_grant
    Bool -> IO ByteString -> IO (Maybe ByteString)
forall (m :: * -> *) a. Applicative m => Bool -> m a -> m (Maybe a)
whenMaybe (Ptr CChar
val Ptr CChar -> Ptr CChar -> Bool
forall a. Eq a => a -> a -> Bool
/= Ptr CChar
forall a. Ptr a
nullPtr) (IO ByteString -> IO (Maybe ByteString))
-> IO ByteString -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ Ptr CChar -> IO ByteString
unsafePackMallocCString Ptr CChar
val

jwtGetAlg :: JwtT -> JwtIO JwtAlgT
jwtGetAlg :: JwtT -> JwtIO JwtAlgT
jwtGetAlg (JwtT ForeignPtr JwtT
pjwt_t) = IO JwtAlgT -> JwtIO JwtAlgT
forall a. IO a -> JwtIO a
JIO (IO JwtAlgT -> JwtIO JwtAlgT) -> IO JwtAlgT -> JwtIO JwtAlgT
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT -> (PJwtT -> IO JwtAlgT) -> IO JwtAlgT
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t PJwtT -> IO JwtAlgT
c_jwt_get_alg

getHeader :: String -> JwtT -> JwtIO (Maybe ByteString)
getHeader :: String -> JwtT -> JwtIO (Maybe ByteString)
getHeader String
h (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  String
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCAString String
h ((Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ (Ptr CChar -> IO ByteString)
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr CChar -> IO ByteString
packCString (IO (Ptr CChar) -> IO (Maybe ByteString))
-> (Ptr CChar -> IO (Ptr CChar))
-> Ptr CChar
-> IO (Maybe ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_header PJwtT
jwt

unsafeGetHeader :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetHeader :: Addr# -> JwtT -> JwtIO (Maybe ByteString)
unsafeGetHeader Addr#
p_header (JwtT ForeignPtr JwtT
pjwt_t) = IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a. IO a -> JwtIO a
JIO (IO (Maybe ByteString) -> JwtIO (Maybe ByteString))
-> IO (Maybe ByteString) -> JwtIO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ ForeignPtr JwtT
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr JwtT
pjwt_t ((PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString))
-> (PJwtT -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ \PJwtT
jwt ->
  (Ptr CChar -> IO ByteString)
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr CChar -> IO ByteString
packCString (IO (Ptr CChar) -> IO (Maybe ByteString))
-> IO (Ptr CChar) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ PJwtT -> Ptr CChar -> IO (Ptr CChar)
c_jwt_get_header PJwtT
jwt (Ptr CChar -> IO (Ptr CChar)) -> Ptr CChar -> IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ Addr# -> Ptr CChar
forall a. Addr# -> Ptr a
Ptr Addr#
p_header

foreign import ccall unsafe "jwt.h jwt_new" c_jwt_new :: Ptr PJwtT -> IO CInt
foreign import ccall unsafe "jwt.h &jwt_free" p_jwt_free :: FunPtr (PJwtT -> IO ())
foreign import ccall unsafe "jwt.h jwt_add_grant" c_jwt_add_grant :: PJwtT -> CString -> CString -> IO CInt
foreign import ccall unsafe "jwt.h jwt_add_grant_bool" c_jwt_add_grant_bool :: PJwtT -> CString -> CInt -> IO CInt
foreign import ccall unsafe "jwt.h jwt_add_grant_int" c_jwt_add_grant_int :: PJwtT -> CString -> CLong -> IO CInt
foreign import ccall unsafe "jwt.h jwt_add_grants_json" c_jwt_add_grants_json :: PJwtT -> CString -> IO CInt
foreign import ccall unsafe "jwt.h jwt_get_grant" c_jwt_get_grant :: PJwtT -> CString -> IO CString
foreign import ccall unsafe "jwt.h jwt_get_grant_bool" c_jwt_get_grant_bool :: PJwtT -> CString -> IO CInt
foreign import ccall unsafe "jwt.h jwt_get_grant_int" c_jwt_get_grant_int :: PJwtT -> CString -> IO CLong
foreign import ccall unsafe "jwt.h jwt_get_grants_json" c_jwt_get_grants_json :: PJwtT -> CString -> IO CString
foreign import ccall unsafe "jwt.h jwt_set_alg" c_jwt_set_alg :: PJwtT -> JwtAlgT -> CString -> CInt -> IO CInt
foreign import ccall unsafe "jwt.h jwt_add_header" c_jwt_add_header :: PJwtT -> CString -> CString -> IO CInt
foreign import ccall unsafe "jwt.h jwt_encode_str" c_jwt_encode_str :: PJwtT -> IO CString
foreign import ccall unsafe "jwt.h jwt_get_alg" c_jwt_get_alg :: PJwtT -> IO JwtAlgT
foreign import ccall unsafe "jwt.h jwt_get_header" c_jwt_get_header :: PJwtT ->  CString -> IO CString
foreign import ccall unsafe "jwt.h jwt_decode" c_jwt_decode :: Ptr PJwtT -> CString -> CString -> CInt -> IO CInt

type PJsmnTokT = Ptr JsmnTokT

-- | Low-level representation of JSON tokenization. Tokens are an exact representation of the underlying JSON, ie no conversions or unescaping has been performed.
--
--   The only exception is @JsStr@ which is already unquoted 
--   (@JsStr@ value is the string between the first and last quotation marks of the corresponding JSON string).
--
--   JSON objects are not parsed at all, but presented as one byte string (@JsBlob@).
data JsonToken = JsStr ByteString
               | JsNum ByteString
               | JsTrue
               | JsFalse
               | JsNull
               | JsArray [JsonToken]
               | JsBlob ByteString

foldrJson :: (JsonToken -> b -> b) -> b -> CString -> PJsmnTokT -> Int -> IO b
foldrJson :: (JsonToken -> b -> b) -> b -> Ptr CChar -> PJsmnTokT -> Int -> IO b
foldrJson JsonToken -> b -> b
f b
z Ptr CChar
p_js PJsmnTokT
ptokens Int
count = StateT Int IO b -> Int -> IO b
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT ((JsonToken -> b -> b) -> b -> Int -> StateT Int IO b
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> b -> b
f b
z Int
count) Int
0
 where
  peekToken :: StateT Int IO JsmnTokT
peekToken   = StateT Int IO Int
forall (m :: * -> *) s. Monad m => StateT s m s
get StateT Int IO Int
-> (Int -> StateT Int IO JsmnTokT) -> StateT Int IO JsmnTokT
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO JsmnTokT -> StateT Int IO JsmnTokT
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO JsmnTokT -> StateT Int IO JsmnTokT)
-> (Int -> IO JsmnTokT) -> Int -> StateT Int IO JsmnTokT
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PJsmnTokT -> Int -> IO JsmnTokT
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff PJsmnTokT
ptokens
  offsetPlus1 :: StateT Int m a -> StateT Int m a
offsetPlus1 = (Int -> Int) -> StateT Int m a -> StateT Int m a
forall s (m :: * -> *) a. (s -> s) -> StateT s m a -> StateT s m a
withStateT (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)

  go :: (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
  go :: (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> a -> a
k a
a Int
n
    | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = a -> StateT Int IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
    | Bool
otherwise = do
      JsmnTokT
tok <- StateT Int IO JsmnTokT
peekToken
      case JsmnTokT -> JsmnTypeT
jsmnType JsmnTokT
tok of
        JsmnTypeT
ttok
          | JsmnTypeT
ttok JsmnTypeT -> JsmnTypeT -> Bool
forall a. Eq a => a -> a -> Bool
== JsmnTypeT
jsmnString
          -> JsonToken -> a -> a
k (JsonToken -> a -> a)
-> (ByteString -> JsonToken) -> ByteString -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> JsonToken
JsStr (ByteString -> a -> a)
-> StateT Int IO ByteString -> StateT Int IO (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ByteString -> StateT Int IO ByteString
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JsmnTokT -> IO ByteString
pack JsmnTokT
tok) StateT Int IO (a -> a) -> StateT Int IO a -> StateT Int IO a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT Int IO a -> StateT Int IO a
forall (m :: * -> *) a. StateT Int m a -> StateT Int m a
offsetPlus1 ((JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> a -> a
k a
a (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
          | JsmnTypeT
ttok JsmnTypeT -> JsmnTypeT -> Bool
forall a. Eq a => a -> a -> Bool
== JsmnTypeT
jsmnPrimitive
          -> JsonToken -> a -> a
k (JsonToken -> a -> a)
-> StateT Int IO JsonToken -> StateT Int IO (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO JsonToken -> StateT Int IO JsonToken
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JsmnTokT -> IO JsonToken
mkPrimToken JsmnTokT
tok) StateT Int IO (a -> a) -> StateT Int IO a -> StateT Int IO a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StateT Int IO a -> StateT Int IO a
forall (m :: * -> *) a. StateT Int m a -> StateT Int m a
offsetPlus1 ((JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> a -> a
k a
a (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
          | JsmnTypeT
ttok JsmnTypeT -> JsmnTypeT -> Bool
forall a. Eq a => a -> a -> Bool
== JsmnTypeT
jsmnArray
          -> let len :: Int
len = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ JsmnTokT -> CInt
size JsmnTokT
tok
             in  JsonToken -> a -> a
k (JsonToken -> a -> a)
-> ([JsonToken] -> JsonToken) -> [JsonToken] -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [JsonToken] -> JsonToken
JsArray ([JsonToken] -> a -> a)
-> StateT Int IO [JsonToken] -> StateT Int IO (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT Int IO [JsonToken] -> StateT Int IO [JsonToken]
forall (m :: * -> *) a. StateT Int m a -> StateT Int m a
offsetPlus1 ((JsonToken -> [JsonToken] -> [JsonToken])
-> [JsonToken] -> Int -> StateT Int IO [JsonToken]
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go (:) [] Int
len) StateT Int IO (a -> a) -> StateT Int IO a -> StateT Int IO a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> a -> a
k a
a (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
          | Bool
otherwise
          -> let supertok :: CInt
supertok = JsmnTokT -> CInt
parent JsmnTokT
tok
             in  do
                   Int
j <- StateT Int IO Int
forall (m :: * -> *) s. Monad m => StateT s m s
get StateT Int IO Int
-> (Int -> StateT Int IO Int) -> StateT Int IO Int
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO Int -> StateT Int IO Int
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO Int -> StateT Int IO Int)
-> (Int -> IO Int) -> Int -> StateT Int IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CInt -> Int -> IO Int
nextSibling CInt
supertok (Int -> IO Int) -> (Int -> Int) -> Int -> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
                   Int -> StateT Int IO ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put Int
j
                   JsonToken -> a -> a
k (JsonToken -> a -> a)
-> (ByteString -> JsonToken) -> ByteString -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> JsonToken
JsBlob (ByteString -> a -> a)
-> StateT Int IO ByteString -> StateT Int IO (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ByteString -> StateT Int IO ByteString
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JsmnTokT -> IO ByteString
pack JsmnTokT
tok) StateT Int IO (a -> a) -> StateT Int IO a -> StateT Int IO a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
forall a. (JsonToken -> a -> a) -> a -> Int -> StateT Int IO a
go JsonToken -> a -> a
k a
a (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)

  mkPrimToken :: JsmnTokT -> IO JsonToken
mkPrimToken JsmnTokT
tok = do
    CChar
c <- Ptr CChar -> Int -> IO CChar
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CChar
p_js (Int -> IO CChar) -> Int -> IO CChar
forall a b. (a -> b) -> a -> b
$ CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ JsmnTokT -> CInt
start JsmnTokT
tok
    case (CChar
c :: CChar) of
      CChar
116 -> JsonToken -> IO JsonToken
forall (m :: * -> *) a. Monad m => a -> m a
return JsonToken
JsTrue
      CChar
110 -> JsonToken -> IO JsonToken
forall (m :: * -> *) a. Monad m => a -> m a
return JsonToken
JsNull
      CChar
102 -> JsonToken -> IO JsonToken
forall (m :: * -> *) a. Monad m => a -> m a
return JsonToken
JsFalse
      CChar
_   -> ByteString -> JsonToken
JsNum (ByteString -> JsonToken) -> IO ByteString -> IO JsonToken
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JsmnTokT -> IO ByteString
pack JsmnTokT
tok

  pack :: JsmnTokT -> IO ByteString
pack JsmnTokT
tok =
    let s :: CInt
s = JsmnTokT -> CInt
start JsmnTokT
tok
        e :: CInt
e = JsmnTokT -> CInt
end JsmnTokT
tok
        n :: CInt
n = CInt
e CInt -> CInt -> CInt
forall a. Num a => a -> a -> a
- CInt
s
    in  (Ptr CChar, Int) -> IO ByteString
packCStringLen (Ptr CChar
p_js Ptr CChar -> Int -> Ptr CChar
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
s, CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
n)

  nextSibling :: CInt -> Int -> IO Int
nextSibling CInt
supertok = (Int -> IO (Either Int Int)) -> Int -> IO Int
forall (m :: * -> *) a b.
Monad m =>
(a -> m (Either a b)) -> a -> m b
loopM
    (\Int
j -> do
      let temp :: PJsmnTokT
temp = PJsmnTokT -> Int -> PJsmnTokT
forall a. Storable a => Ptr a -> Int -> Ptr a
advancePtr PJsmnTokT
ptokens Int
j
      JsmnTypeT
t <- PJsmnTokT -> IO JsmnTypeT
peekType PJsmnTokT
temp
      CInt
p <- PJsmnTokT -> IO CInt
peekParent PJsmnTokT
temp
      Either Int Int -> IO (Either Int Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Int Int -> IO (Either Int Int))
-> Either Int Int -> IO (Either Int Int)
forall a b. (a -> b) -> a -> b
$ if JsmnTypeT
t JsmnTypeT -> JsmnTypeT -> Bool
forall a. Eq a => a -> a -> Bool
== JsmnTypeT
jsmnUndefined Bool -> Bool -> Bool
|| CInt
p CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
supertok
        then Int -> Either Int Int
forall a b. b -> Either a b
Right Int
j
        else Int -> Either Int Int
forall a b. a -> Either a b
Left (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
    )

unsafeUseTokenizedJsonArray
  :: (CString -> Ptr JsmnTokT -> Int -> IO a) -> ByteString -> IO (Maybe a)
unsafeUseTokenizedJsonArray :: (Ptr CChar -> PJsmnTokT -> Int -> IO a)
-> ByteString -> IO (Maybe a)
unsafeUseTokenizedJsonArray Ptr CChar -> PJsmnTokT -> Int -> IO a
f ByteString
js =
  ByteString -> ((Ptr CChar, Int) -> IO (Maybe a)) -> IO (Maybe a)
forall a. ByteString -> ((Ptr CChar, Int) -> IO a) -> IO a
unsafeUseAsCStringLen ByteString
js (((Ptr CChar, Int) -> IO (Maybe a)) -> IO (Maybe a))
-> ((Ptr CChar, Int) -> IO (Maybe a)) -> IO (Maybe a)
forall a b. (a -> b) -> a -> b
$ \(Ptr CChar
p_js, Int
jslen) -> (Ptr PJsmnTokT -> IO (Maybe a)) -> IO (Maybe a)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr PJsmnTokT -> IO (Maybe a)) -> IO (Maybe a))
-> (Ptr PJsmnTokT -> IO (Maybe a)) -> IO (Maybe a)
forall a b. (a -> b) -> a -> b
$ \Ptr PJsmnTokT
out -> do
    CInt
r <- Ptr CChar -> CSize -> Ptr PJsmnTokT -> IO CInt
c_tokenize_json Ptr CChar
p_js (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
jslen) Ptr PJsmnTokT
out
    if CInt
r CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0
      then String -> Errno -> IO (Maybe a)
forall a. String -> Errno -> IO a
throwLibjwt String
"tokenize_json" (CInt -> Errno
Errno (CInt -> Errno) -> CInt -> Errno
forall a b. (a -> b) -> a -> b
$ CInt -> CInt
forall a. Num a => a -> a
negate CInt
r)
      else do
        PJsmnTokT
ptokens <- Ptr PJsmnTokT -> IO PJsmnTokT
forall a. Storable a => Ptr a -> IO a
peek Ptr PJsmnTokT
out
        JsmnTokT
tok0    <- PJsmnTokT -> IO JsmnTokT
forall a. Storable a => Ptr a -> IO a
peek PJsmnTokT
ptokens
        Maybe a
res     <- Bool -> IO a -> IO (Maybe a)
forall (m :: * -> *) a. Applicative m => Bool -> m a -> m (Maybe a)
whenMaybe (JsmnTokT -> JsmnTypeT
jsmnType JsmnTokT
tok0 JsmnTypeT -> JsmnTypeT -> Bool
forall a. Eq a => a -> a -> Bool
== JsmnTypeT
jsmnArray)
          (IO a -> IO (Maybe a)) -> IO a -> IO (Maybe a)
forall a b. (a -> b) -> a -> b
$ Ptr CChar -> PJsmnTokT -> Int -> IO a
f Ptr CChar
p_js (PJsmnTokT -> Int -> PJsmnTokT
forall a. Storable a => Ptr a -> Int -> Ptr a
advancePtr PJsmnTokT
ptokens Int
1) (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ JsmnTokT -> CInt
size JsmnTokT
tok0)
        PJsmnTokT -> IO ()
forall a. Ptr a -> IO ()
free PJsmnTokT
ptokens
        Maybe a -> IO (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
res

unsafeMapTokenizedJsonArray
  :: (JsonToken -> b) -> ByteString -> JwtIO (Maybe [b])
unsafeMapTokenizedJsonArray :: (JsonToken -> b) -> ByteString -> JwtIO (Maybe [b])
unsafeMapTokenizedJsonArray JsonToken -> b
f =
  IO (Maybe [b]) -> JwtIO (Maybe [b])
forall a. IO a -> JwtIO a
JIO (IO (Maybe [b]) -> JwtIO (Maybe [b]))
-> (ByteString -> IO (Maybe [b]))
-> ByteString
-> JwtIO (Maybe [b])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Ptr CChar -> PJsmnTokT -> Int -> IO [b])
-> ByteString -> IO (Maybe [b])
forall a.
(Ptr CChar -> PJsmnTokT -> Int -> IO a)
-> ByteString -> IO (Maybe a)
unsafeUseTokenizedJsonArray ((JsonToken -> [b] -> [b])
-> [b] -> Ptr CChar -> PJsmnTokT -> Int -> IO [b]
forall b.
(JsonToken -> b -> b) -> b -> Ptr CChar -> PJsmnTokT -> Int -> IO b
foldrJson ((:) (b -> [b] -> [b]) -> (JsonToken -> b) -> JsonToken -> [b] -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JsonToken -> b
f) [])

foreign import ccall unsafe "tokenize_json" c_tokenize_json :: CString -> CSize -> Ptr PJsmnTokT -> IO CInt

wrapJwtPtr :: PJwtT -> IO JwtT
wrapJwtPtr :: PJwtT -> IO JwtT
wrapJwtPtr = IO (ForeignPtr JwtT) -> IO JwtT
coerce (IO (ForeignPtr JwtT) -> IO JwtT)
-> (PJwtT -> IO (ForeignPtr JwtT)) -> PJwtT -> IO JwtT
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FinalizerPtr JwtT -> PJwtT -> IO (ForeignPtr JwtT)
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr JwtT
p_jwt_free

throwIfNonZero_ :: String -> IO CInt -> IO ()
throwIfNonZero_ :: String -> IO CInt -> IO ()
throwIfNonZero_ String
loc IO CInt
f = do
  CInt
res <- IO CInt
f
  if CInt
res CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
0 then () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return () else String -> Errno -> IO ()
forall a. String -> Errno -> IO a
throwLibjwt String
loc (Errno -> IO ()) -> Errno -> IO ()
forall a b. (a -> b) -> a -> b
$ CInt -> Errno
Errno CInt
res

whenMaybeNotNull :: (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull :: (Ptr a -> IO b) -> IO (Ptr a) -> IO (Maybe b)
whenMaybeNotNull Ptr a -> IO b
f IO (Ptr a)
io = do
  Ptr a
res <- IO (Ptr a)
io
  Bool -> IO b -> IO (Maybe b)
forall (m :: * -> *) a. Applicative m => Bool -> m a -> m (Maybe a)
whenMaybe (Ptr a
res Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
/= Ptr a
forall a. Ptr a
nullPtr) (IO b -> IO (Maybe b)) -> IO b -> IO (Maybe b)
forall a b. (a -> b) -> a -> b
$ Ptr a -> IO b
f Ptr a
res

throwLibjwt :: String -> Errno -> IO a
throwLibjwt :: String -> Errno -> IO a
throwLibjwt String
loc Errno
err = IOError -> IO a
forall e a. Exception e => e -> IO a
throwIO (IOError -> IO a) -> IOError -> IO a
forall a b. (a -> b) -> a -> b
$ String -> Errno -> Maybe Handle -> Maybe String -> IOError
errnoToIOError String
loc Errno
err Maybe Handle
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing

throwErrnoOrNoEnt :: String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt :: String -> IO a -> IO (Maybe a)
throwErrnoOrNoEnt String
loc IO a
f = do
  a
res <- IO a
f
  Errno
err <- IO Errno
getErrno
  if Errno
err Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
== Errno
eOK
    then Maybe a -> IO (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a -> IO (Maybe a)) -> Maybe a -> IO (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
res
    else if Errno
err Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
== Errno
eNOENT Bool -> Bool -> Bool
|| Errno
err Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
== Errno
eINVAL
      then Maybe a -> IO (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
      else String -> Errno -> IO (Maybe a)
forall a. String -> Errno -> IO a
throwLibjwt String
loc Errno
err