-- |
-- Module      :  Robotics.ROS.Msg.Class
-- Copyright   :  Alexander Krupenkin 2016
-- License     :  BSD3
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  POSIX / WIN32
--
-- ROS message type class declaration.
--
module Robotics.ROS.Msg.Class (
    Message(..)
  , Stamped(..)
  ) where

import Robotics.ROS.Msg.Types (ROSTime)
import Data.Digest.Pure.MD5 (MD5Digest)
import Data.ByteString (ByteString)
import Data.Binary (Binary)
import Data.Word (Word32)
import Data.Text (Text)

-- | Haskell native type for ROS message language described
-- data structure. Serialization guaranted by 'Binary' super
-- class. And no more is needed for transfer over socket.
class Binary a => Message a where
    -- | Get message type string, e.g. @std_msgs/Char@
    getType   :: a -> Text

    -- | Get message source
    getSource :: a -> Text

    -- | Get recurrent MD5 of message source
    getDigest :: a -> MD5Digest

-- | Sometime ROS messages have a special @Header@ field.
-- It used for tracking package sequence, time stamping
-- and frame tagging. Headers is frequently field. The
-- 'Stamped' type class lifts header fields on the top
-- of message and abstracting of type.
class Message a => Stamped a where
    -- | Get sequence number
    getSequence :: a -> Word32

    -- | Set sequence number
    setSequence :: Word32 -> a -> a

    -- | Get timestamp of message
    getStamp    :: a -> ROSTime

    -- | Get frame of message
    getFrame    :: a -> ByteString