protected virtual void CreateService(RosTypeInfo rosType, ServiceDescriptor service)
        {
            if (NameMapper.IsBuiltInType(rosType))
            {
                return;
            }

            WriteServiceInternal(rosType);

            WriteMessageInternal(rosType, DetailedRosMessageType.ServiceRequest, service.Request);
            WriteMessageInternal(rosType, DetailedRosMessageType.ServiceResponse, service.Response);
        }
        private void WriteMessageInternal(RosTypeInfo rosType, DetailedRosMessageType messageType, MessageDescriptor message)
        {
            if (messageType == DetailedRosMessageType.None ||
                messageType == DetailedRosMessageType.Action ||
                messageType == DetailedRosMessageType.Service)
            {
                throw new ArgumentException($"message type is not detailed enough", nameof(messageType));
            }

            if (NameMapper.IsBuiltInType(rosType))
            {
                return;
            }

            var data = GetMessageTemplateData(rosType, messageType, message);

            SanitizeMessageTemplateData(data);

            var filePath = _directories.TempDirectory.GetFilePath($"{data.TypeName}.cs");
            var content  = _templateEngine.Format(MessageTemplateFile, data);

            WriteFile(filePath, content);
        }