rosmsg-0.4.3.1: src/Robotics/ROS/Msg/Render.hs
-- |
-- Module : Robotics.ROS.Msg.Render
-- Copyright : Alexander Krupenkin 2016
-- License : BSD3
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : POSIX / WIN32
--
-- The ROS message language builder from abstract message definition.
--
module Robotics.ROS.Msg.Render (
-- * Create lazy text builder from message definition
render
-- * Create builder with custom type hook
, render'
) where
import Data.Text.Lazy.Builder (Builder, fromText, fromString)
import Data.Char (toLower)
import Data.Monoid ((<>))
import Data.Text (Text)
import Robotics.ROS.Msg.Types
-- | Builder creator from 'FieldType'
rosType :: (Text -> Text) -> FieldType -> Builder
rosType _ (Simple t) = fromString $ fmap toLower $ drop 1 $ show t
rosType u (Custom t) = fromText $ u t
rosType u (Array t) = rosType u t <> "[]"
rosType u (FixedArray l t) = rosType u t <> "[" <> fromString (show l) <> "]"
-- | Like 'render' by first argument is custom type modifier hook
render' :: (Text -> Text) -> MsgDefinition -> Builder
render' uType = foldl (\a b -> a <> "\n" <> b) mempty . fmap go . sort
where sort v = filter isConstant v ++ filter (not . isConstant) v
go (Constant (typ, name) val) = rosType uType typ <> " " <>
fromText name <> "=" <> fromText val
go (Variable (typ, name)) = rosType uType typ <> " " <> fromText name
isConstant x = case x of
Constant _ _ -> True
_ -> False
-- | Render formal ROS message definition according to:
--
-- * comments removed
--
-- * whitespace removed
--
-- * package names of dependencies removed
--
-- * constants reordered ahead of other declarations
-- from http://www.ros.org/wiki/ROS/Technical%20Overview
--
render :: MsgDefinition -> Builder
render = render' id