module System.Mesos.Raw.Parameter where
import           System.Mesos.Internal

type ParameterPtr = Ptr Parameter

data Parameter = Parameter ByteString ByteString
  deriving (Eq, Show)

foreign import ccall unsafe "ext/types.h toParameter" c_toParameter
  :: Ptr CChar
  -> CInt
  -> Ptr CChar
  -> CInt
  -> IO ParameterPtr

foreign import ccall unsafe "ext/types.h fromParameter" c_fromParameter
  :: ParameterPtr
  -> Ptr (Ptr CChar)
  -> Ptr CInt
  -> Ptr (Ptr CChar)
  -> Ptr CInt
  -> IO ()

foreign import ccall unsafe "ext/types.h destroyParameter" c_destroyParameter
  :: ParameterPtr
  -> IO ()

instance CPPValue Parameter where

  marshal (Parameter key value) = do
    k@(kp, kl) <- cstring key
    v@(vp, vl) <- cstring value
    liftIO $ c_toParameter kp (fromIntegral kl) vp (fromIntegral vl)

  unmarshal p = do
    kp@(kpp, klp) <- arrayPair
    vp@(vpp, vlp) <- arrayPair
    liftIO $ c_fromParameter p kpp klp vpp vlp
    k <- peekCString kp
    v <- peekCString vp
    return $ Parameter k v

  destroy = c_destroyParameter