module Robotics.ROS.Msg.Render (
render
, 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
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) <> "]"
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 :: MsgDefinition -> Builder
render = render' id