{-# LANGUAGE ForeignFunctionInterface #-}
module Clingo.Raw.Basic
(
    errorString,
    errorCode,
    errorMessage,
    setError,
    warningString,
    version
)
where

import Foreign
import Foreign.C
import Control.Monad.IO.Class
import Clingo.Raw.Enums

foreign import ccall "clingo.h clingo_error_string" errorStringFFI ::
    ClingoError -> IO CString
foreign import ccall "clingo.h clingo_error_code" errorCodeFFI ::
    IO ClingoError
foreign import ccall "clingo.h clingo_error_message" errorMessageFFI ::
    IO CString
foreign import ccall "clingo.h clingo_set_error" setErrorFFI ::
    ClingoError -> CString -> IO ()
foreign import ccall "clingo.h clingo_warning_string" warningStringFFI ::
    ClingoWarning -> IO CString
foreign import ccall "clingo.h clingo_version" versionFFI ::
    Ptr CInt -> Ptr CInt -> Ptr CInt -> IO ()

errorString :: MonadIO m => ClingoError -> m CString
errorString = liftIO . errorStringFFI

errorCode :: MonadIO m => m ClingoError
errorCode = liftIO errorCodeFFI

errorMessage :: MonadIO m => m CString
errorMessage = liftIO errorMessageFFI

setError :: MonadIO m => ClingoError -> CString -> m ()
setError a b = liftIO $ setErrorFFI a b

warningString :: MonadIO m => ClingoWarning -> m CString
warningString = liftIO . warningStringFFI

version :: MonadIO m => Ptr CInt -> Ptr CInt -> Ptr CInt -> m ()
version a b c = liftIO $ versionFFI a b c