module Database.DuckDB.FFI.Expression (
    c_duckdb_destroy_expression,
    c_duckdb_expression_return_type,
    c_duckdb_expression_is_foldable,
    c_duckdb_expression_fold,
) where

import Database.DuckDB.FFI.Types
import Foreign.C.Types (CBool (..))
import Foreign.Ptr (Ptr)

{- | Destroys the expression and de-allocates its memory.

Parameters:
* @expr@: A pointer to the expression.
-}
foreign import ccall safe "duckdb_destroy_expression"
    c_duckdb_destroy_expression :: Ptr DuckDBExpression -> IO ()

{- | Returns the return type of an expression.

Parameters:
* @expr@: The expression.

Returns The return type. Must be destroyed with @duckdb_destroy_logical_type@.
-}
foreign import ccall safe "duckdb_expression_return_type"
    c_duckdb_expression_return_type :: DuckDBExpression -> IO DuckDBLogicalType

{- | Returns whether the expression is foldable into a value or not.

Parameters:
* @expr@: The expression.

Returns True, if the expression is foldable, else false.
-}
foreign import ccall safe "duckdb_expression_is_foldable"
    c_duckdb_expression_is_foldable :: DuckDBExpression -> IO CBool

{- | Folds an expression creating a folded value.

Parameters:
* @context@: The client context.
* @expr@: The expression. Must be foldable.
* @out_value@: The folded value, if folding was successful. Must be destroyed
  with @duckdb_destroy_value@.

Returns The error data. Must be destroyed with @duckdb_destroy_error_data@.
-}
foreign import ccall "duckdb_expression_fold"
    c_duckdb_expression_fold :: DuckDBClientContext -> DuckDBExpression -> Ptr DuckDBValue -> IO DuckDBErrorData