-- |
-- Module      :  Robotics.ROS.Msg.MD5
-- Copyright   :  Alexander Krupenkin 2016
-- License     :  BSD3
--
-- Maintainer  :  mail@akru.me
-- Stability   :  exp
-- Portability :  POSIX / WIN32
--
-- ROS message MD5 recurrent hash. Replace user types by it's MD5 and
-- take hash of result.
--
module Robotics.ROS.Msg.MD5 (
    MD5Digest
  , computeMD5
  ) where

import Data.Digest.Pure.MD5 (MD5Digest, md5)
import Data.ByteString.Lazy (fromStrict)
import Data.Text.Encoding (encodeUtf8)
import Data.Text (Text, replace, pack)

-- | Compute MD5 for given message with user type hashes
--
-- Recursively generate MD5 for subtype. Have to build up 
-- dependency representation for subtype in order to                                     
-- generate MD5. 
computeMD5 :: [(Text, MD5Digest)] -- ^ List of pairs: user type name, message hash
           -> Text                -- ^ Full message source
           -> MD5Digest           -- ^ Message MD5
computeMD5 [] msg = md5 (fromStrict (encodeUtf8 msg))
computeMD5 ((dep, hash) : xs) msg = computeMD5 xs msg'
  where msg' = replace dep (pack $ show hash) msg