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

toEnvVar :: (ByteString, ByteString) -> EnvironmentVariable
toEnvVar (k, v) = EnvironmentVariable k v

fromEnvVar :: EnvironmentVariable -> (ByteString, ByteString)
fromEnvVar (EnvironmentVariable k v) = (k, v)

type EnvironmentVariablePtr = Ptr EnvironmentVariable

data EnvironmentVariable = EnvironmentVariable
  { environmentVariableKey   :: !ByteString
  , environmentVariableValue :: !ByteString
  } deriving (Show, Eq)

foreign import ccall unsafe "ext/types.h toEnvironmentVariable" c_toEnvironmentVariable
  :: Ptr CChar
  -> CInt
  -> Ptr CChar
  -> CInt
  -> IO EnvironmentVariablePtr

foreign import ccall unsafe "ext/types.h fromEnvironmentVariable" c_fromEnvironmentVariable
  :: EnvironmentVariablePtr
  -> Ptr (Ptr CChar)
  -> Ptr CInt
  -> Ptr (Ptr CChar)
  -> Ptr CInt
  -> IO ()

foreign import ccall unsafe "ext/types.h destroyEnvironmentVariable" c_destroyEnvironmentVariable
  :: EnvironmentVariablePtr
  -> IO ()

instance CPPValue EnvironmentVariable where

  marshal e = do
    (kp, kl) <- cstring $ environmentVariableKey e
    (vp, vl) <- cstring $ environmentVariableValue e
    liftIO $ c_toEnvironmentVariable kp (fromIntegral kl) vp (fromIntegral vl)

  unmarshal e = do
    kp@(kpp, klp) <- arrayPair
    vp@(vpp, vlp) <- arrayPair
    liftIO $ c_fromEnvironmentVariable e kpp klp vpp vlp
    k <- peekCString kp
    v <- peekCString vp
    return $ EnvironmentVariable k v

  destroy = c_destroyEnvironmentVariable