module Text.Regex.Pcre2.Foreign.TH where

import Language.Haskell.TH

{-
    For example,
constant "ERROR_NOMATCH" ''CInt
    will produce
foreign import capi unsafe "pcre2.h value PCRE2_ERROR_NOMATCH"
    pcre2_ERROR_NOMATCH :: CInt
-}
constant :: String -> Name -> DecsQ
constant :: String -> Name -> DecsQ
constant String
suffix Name
typeName = [Dec] -> DecsQ
forall (m :: * -> *) a. Monad m => a -> m a
return [Dec
dec] where
    dec :: Dec
dec = Foreign -> Dec
ForeignD (Foreign -> Dec) -> Foreign -> Dec
forall a b. (a -> b) -> a -> b
$ Callconv -> Safety -> String -> Name -> Type -> Foreign
ImportF Callconv
CApi Safety
Unsafe String
str Name
name Type
ty
    str :: String
str = String
"pcre2.h value PCRE2_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
suffix
    name :: Name
name = String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ String
"pcre2_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
suffix
    ty :: Type
ty = Name -> Type
ConT Name
typeName

{-
    For example,
getter "callout_block" "version" ''CUInt
    will produce
foreign import capi unsafe "getters.h" pcre2_callout_block_version
    :: Ptr Pcre2_callout_block
    -> IO CUInt
-}
getter :: String -> String -> Name -> DecsQ
getter :: String -> String -> Name -> DecsQ
getter String
blockSuffix String
field Name
typeName = [Dec] -> DecsQ
forall (m :: * -> *) a. Monad m => a -> m a
return [Dec
dec] where
    dec :: Dec
dec = Foreign -> Dec
ForeignD (Foreign -> Dec) -> Foreign -> Dec
forall a b. (a -> b) -> a -> b
$ Callconv -> Safety -> String -> Name -> Type -> Foreign
ImportF Callconv
CApi Safety
Unsafe String
"getters.h" Name
name Type
ty
    name :: Name
name = String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ String
"pcre2_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
blockSuffix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
field
    ty :: Type
ty = Type -> Type -> Type
AppT
        (Type -> Type -> Type
AppT Type
ArrowT (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type -> Type -> Type
AppT
            (Name -> Type
ConT (Name -> Type) -> Name -> Type
forall a b. (a -> b) -> a -> b
$ String -> Name
mkName String
"Ptr")
            (Name -> Type
ConT (Name -> Type) -> Name -> Type
forall a b. (a -> b) -> a -> b
$ String -> Name
mkName (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ String
"Pcre2_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
blockSuffix))
        (Type -> Type -> Type
AppT
            (Name -> Type
ConT (Name -> Type) -> Name -> Type
forall a b. (a -> b) -> a -> b
$ String -> Name
mkName String
"IO")
            (Name -> Type
ConT Name
typeName))