-- GENERATED by C->Haskell Compiler, version 0.28.7 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/XlsxWriter/Workbook.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
-- | https://libxlsxwriter.github.io/workbook_8h.html
module XlsxWriter.Workbook where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified Foreign.Storable as C2HSImp





import Data.Foldable
import Foreign
import Foreign.C
import Data.ByteString
import XlsxWriter.Common
{-# LINE 11 "src/XlsxWriter/Workbook.chs" #-}

import XlsxWriter.Format
{-# LINE 12 "src/XlsxWriter/Workbook.chs" #-}

import XlsxWriter.Worksheet


{-# LINE 15 "src/XlsxWriter/Workbook.chs" #-}


-- these structs are only used via opaque pointers, so we follow the
-- convention of giving naming priority to the generated pointer
-- rather than the struct value (i.e. Workbook, not WorkbookPtr)
data Workbook_struct
type Workbook = C2HSImp.Ptr (Workbook_struct)
{-# LINE 21 "src/XlsxWriter/Workbook.chs" #-}


data WorkbookOptions = WorkbookOptions
  { WorkbookOptions -> Bool
woConstantMemory :: Bool,
    WorkbookOptions -> Maybe ByteString
woTmpdir :: Maybe ByteString,
    WorkbookOptions -> Bool
woUseZip64 :: Bool
  }
  deriving (Int -> WorkbookOptions -> ShowS
[WorkbookOptions] -> ShowS
WorkbookOptions -> String
(Int -> WorkbookOptions -> ShowS)
-> (WorkbookOptions -> String)
-> ([WorkbookOptions] -> ShowS)
-> Show WorkbookOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WorkbookOptions] -> ShowS
$cshowList :: [WorkbookOptions] -> ShowS
show :: WorkbookOptions -> String
$cshow :: WorkbookOptions -> String
showsPrec :: Int -> WorkbookOptions -> ShowS
$cshowsPrec :: Int -> WorkbookOptions -> ShowS
Show)

instance Storable WorkbookOptions where
  sizeOf :: WorkbookOptions -> Int
sizeOf WorkbookOptions
_ = Int
24
{-# LINE 31 "src/XlsxWriter/Workbook.chs" #-}

  alignment _ = 8
{-# LINE 32 "src/XlsxWriter/Workbook.chs" #-}

  peek p = do
    constMem <- (/= 0) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CUChar}) p
    tmpdir <-
      (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr C2HSImp.CChar)}) p
      >>= \ptr -> if ptr == nullPtr then pure Nothing else (Just <$> packCString ptr)
    useZip64 <- (/= 0) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO C2HSImp.CUChar}) p
    pure $ WorkbookOptions constMem tmpdir useZip64
  poke :: Ptr WorkbookOptions -> WorkbookOptions -> IO ()
poke Ptr WorkbookOptions
p WorkbookOptions
x = do
    (\Ptr WorkbookOptions
ptr CUChar
val -> do {Ptr WorkbookOptions -> Int -> CUChar -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
C2HSImp.pokeByteOff Ptr WorkbookOptions
ptr Int
0 (CUChar
val :: C2HSImp.CUChar)}) Ptr WorkbookOptions
p (CUChar -> IO ()) -> CUChar -> IO ()
forall a b. (a -> b) -> a -> b
$
      if WorkbookOptions -> Bool
woConstantMemory WorkbookOptions
x then CUChar
1 else CUChar
0
    Maybe ByteString -> (ByteString -> IO ()) -> IO ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (WorkbookOptions -> Maybe ByteString
woTmpdir WorkbookOptions
x) ((ByteString -> IO ()) -> IO ()) -> (ByteString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ByteString
dir -> ByteString -> (Ptr CChar -> IO ()) -> IO ()
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
dir ((Ptr CChar -> IO ()) -> IO ()) -> (Ptr CChar -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
cstr ->
      (\Ptr WorkbookOptions
ptr Ptr CChar
val -> do {Ptr WorkbookOptions -> Int -> Ptr CChar -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
C2HSImp.pokeByteOff Ptr WorkbookOptions
ptr Int
8 (Ptr CChar
val :: (C2HSImp.Ptr C2HSImp.CChar))}) Ptr WorkbookOptions
p Ptr CChar
cstr
    (\Ptr WorkbookOptions
ptr CUChar
val -> do {Ptr WorkbookOptions -> Int -> CUChar -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
C2HSImp.pokeByteOff Ptr WorkbookOptions
ptr Int
16 (CUChar
val :: C2HSImp.CUChar)}) Ptr WorkbookOptions
p (CUChar -> IO ()) -> CUChar -> IO ()
forall a b. (a -> b) -> a -> b
$
      if WorkbookOptions -> Bool
woUseZip64 WorkbookOptions
x then CUChar
1 else CUChar
0

type WorkbookOptionsPtr = C2HSImp.Ptr (WorkbookOptions)
{-# LINE 48 "src/XlsxWriter/Workbook.chs" #-}


workbook_new :: (ByteString) -> IO ((Workbook))
workbook_new :: ByteString -> IO Workbook
workbook_new ByteString
a1 =
  ByteString -> (Ptr CChar -> IO Workbook) -> IO Workbook
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
useAsCString ByteString
a1 ((Ptr CChar -> IO Workbook) -> IO Workbook)
-> (Ptr CChar -> IO Workbook) -> IO Workbook
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
a1' -> 
  Ptr CChar -> IO Workbook
workbook_new'_ Ptr CChar
a1' IO Workbook -> (Workbook -> IO Workbook) -> IO Workbook
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Workbook
res ->
  let {res' :: Workbook
res' = Workbook -> Workbook
forall a. a -> a
id Workbook
res} in
  Workbook -> IO Workbook
forall (m :: * -> *) a. Monad m => a -> m a
return (Workbook
res')

{-# LINE 51 "src/XlsxWriter/Workbook.chs" #-}


workbook_new_opt :: (ByteString) -> (WorkbookOptions) -> IO ((Workbook))
workbook_new_opt a1 a2 =
  useAsCString a1 $ \a1' -> 
  with a2 $ \a2' -> 
  workbook_new_opt'_ a1' a2' >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 54 "src/XlsxWriter/Workbook.chs" #-}


-- Writing this one manually because importing certain aspects of
-- Worksheet triggers unclear c2hs bugs:
-- https://github.com/haskell/c2hs/issues/189
workbook_add_worksheet :: Workbook -> ByteString -> IO Worksheet
workbook_add_worksheet wb name = do
  useAsCString name $ workbook_add_worksheet'_ wb

foreign import ccall unsafe "XlsxWriter/Workbook.chs.h workbook_add_worksheet"
  workbook_add_worksheet'_ :: Workbook -> Ptr CChar -> IO Worksheet

workbook_add_format :: (Workbook) -> IO ((Format))
workbook_add_format :: Workbook -> IO Format
workbook_add_format Workbook
a1 =
  let {a1' :: Workbook
a1' = Workbook -> Workbook
forall a. a -> a
id Workbook
a1} in 
  Workbook -> IO Format
workbook_add_format'_ Workbook
a1' IO Format -> (Format -> IO Format) -> IO Format
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Format
res ->
  let {res' :: Format
res' = Format -> Format
forall a. a -> a
id Format
res} in
  Format -> IO Format
forall (m :: * -> *) a. Monad m => a -> m a
return (Format
res')

{-# LINE 66 "src/XlsxWriter/Workbook.chs" #-}


workbook_close :: (Workbook) -> IO ((Error))
workbook_close a1 =
  let {a1' = id a1} in 
  workbook_close'_ a1' >>= \res ->
  let {res' = (toEnum . fromIntegral) res} in
  return (res')

{-# LINE 68 "src/XlsxWriter/Workbook.chs" #-}


foreign import ccall unsafe "XlsxWriter/Workbook.chs.h workbook_new"
  workbook_new'_ :: ((C2HSImp.Ptr C2HSImp.CChar) -> (IO (Workbook)))

foreign import ccall unsafe "XlsxWriter/Workbook.chs.h workbook_new_opt"
  workbook_new_opt'_ :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((WorkbookOptionsPtr) -> (IO (Workbook))))

foreign import ccall unsafe "XlsxWriter/Workbook.chs.h workbook_add_format"
  workbook_add_format'_ :: ((Workbook) -> (IO (Format)))

foreign import ccall unsafe "XlsxWriter/Workbook.chs.h workbook_close"
  workbook_close'_ :: ((Workbook) -> (IO C2HSImp.CInt))