{-# LANGUAGE CApiFFI #-}
module OpenCascade.XSControl.Reader 
( Reader
, readFile
, transferRoots
, oneShape
) where

import Prelude hiding (readFile)
import OpenCascade.XSControl.Types (Reader)
import OpenCascade.IFSelect.ReturnStatus (ReturnStatus)
import qualified OpenCascade.TopoDS.Types as TopoDS
import OpenCascade.TopoDS.Internal.Destructors (deleteShape)
import OpenCascade.Internal.Bool (cBoolToBool)
import Foreign.C.String (CString, withCString)
import Foreign.C (CInt (..), CBool (..))
import Foreign.Ptr (Ptr)
import Data.Acquire (Acquire, mkAcquire)

foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_readFile" rawReadFile :: Ptr Reader -> CString -> IO CInt

readFile :: Ptr Reader -> String -> IO ReturnStatus
readFile :: Ptr Reader -> String -> IO ReturnStatus
readFile Ptr Reader
reader String
s = Int -> ReturnStatus
forall a. Enum a => Int -> a
toEnum (Int -> ReturnStatus) -> (CInt -> Int) -> CInt -> ReturnStatus
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> ReturnStatus) -> IO CInt -> IO ReturnStatus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> (CString -> IO CInt) -> IO CInt
forall a. String -> (CString -> IO a) -> IO a
withCString String
s (Ptr Reader -> CString -> IO CInt
rawReadFile Ptr Reader
reader)


foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_transferRoots" rawTransferRoots :: Ptr Reader  -> IO (CBool)

transferRoots :: Ptr Reader -> IO Bool
transferRoots :: Ptr Reader -> IO Bool
transferRoots Ptr Reader
reader = CBool -> Bool
cBoolToBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr Reader -> IO CBool
rawTransferRoots Ptr Reader
reader

foreign import capi unsafe "hs_XSControl_Reader.h hs_XSControl_Reader_oneShape" rawOneShape :: Ptr Reader  -> IO (Ptr TopoDS.Shape) 

oneShape :: Ptr Reader -> Acquire (Ptr TopoDS.Shape)
oneShape :: Ptr Reader -> Acquire (Ptr Shape)
oneShape Ptr Reader
reader  = IO (Ptr Shape) -> (Ptr Shape -> IO ()) -> Acquire (Ptr Shape)
forall a. IO a -> (a -> IO ()) -> Acquire a
mkAcquire (Ptr Reader -> IO (Ptr Shape)
rawOneShape Ptr Reader
reader) Ptr Shape -> IO ()
deleteShape