{-# LANGUAGE OverloadedStrings #-}
module System.Mesos.Raw.Attribute where
import           System.Mesos.Internal
import           System.Mesos.Raw.Value

type AttributePtr = Ptr Attribute

data Attribute = Attribute
  { attributeName  :: !ByteString
  , attributeValue :: !Value
  } deriving (Show, Eq)

toAttribute :: (ByteString, Value) -> Attribute
toAttribute (k, v) = Attribute k v

fromAttribute :: Attribute -> (ByteString, Value)
fromAttribute (Attribute k v) = (k, v)

foreign import ccall unsafe "ext/types.h toAttribute" c_toAttribute
  :: Ptr CChar
  -> CInt
  -> ValuePtr
  -> IO AttributePtr

foreign import ccall unsafe "ext/types.h fromAttribute" c_fromAttribute
  :: AttributePtr
  -> Ptr (Ptr CChar)
  -> Ptr CInt
  -> Ptr ValuePtr
  -> IO ()

foreign import ccall unsafe "ext/types.h destroyAttribute" c_destroyAttribute
  :: AttributePtr
  -> IO ()

instance CPPValue Attribute where

  marshal a = do
    (np, nl) <- cstring $ attributeName a
    vp <- cppValue $ attributeValue a
    p <- liftIO $ c_toAttribute np (fromIntegral nl) vp
    return p

  unmarshal ap = do
    nps@(npp, nlp) <- arrayPair
    vpp <- alloc
    liftIO $ c_fromAttribute ap npp nlp vpp
    vp <- peek vpp
    n <- peekCString nps
    v <- peekCPP vp
    return $ Attribute n v

  destroy = c_destroyAttribute