Esempio n. 1
0
        internal ClassInfo(string?package, string messageName, IEnumerable <IElement> newElements,
                           string?actionRoot, ActionMessageType actionMessageType)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            int lastSlash = messageName.LastIndexOf('/');

            if (lastSlash != -1)
            {
                if (!string.IsNullOrEmpty(package))
                {
                    throw new ArgumentException(
                              "messageName contains a package, but package is not null. Only one of both must be set!");
                }

                package     = messageName.Substring(0, lastSlash);
                messageName = messageName.Substring(lastSlash + 1);
            }

            if (messageName == null)
            {
                throw new ArgumentNullException(nameof(messageName));
            }

            if (newElements == null)
            {
                throw new ArgumentNullException(nameof(newElements));
            }

            Console.WriteLine($"-- Parsing synthetic '{package}/{messageName}'");

            RosPackage = package;
            CsPackage  = MsgParser.CsIfy(package);
            Name       = messageName;

            elements = newElements.ToArray();
            Elements = new ReadOnlyCollection <IElement>(elements);

            ForceStruct     = false;
            fullMessageText = string.Join("\n", elements.Select(elem => elem.ToRosString()));

            variables = elements.OfType <VariableElement>().ToArray();

            this.actionRoot        = actionRoot;
            this.actionMessageType = actionMessageType;
        }
Esempio n. 2
0
        public ServiceInfo(string package, string path)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }

            if (!File.Exists(path))
            {
                throw new ArgumentException($"File {path} does not exist.");
            }

            Console.WriteLine($"-- Parsing '{path}'");

            RosPackage = package;
            CsPackage  = MsgParser.CsIfy(package);
            Name       = Path.GetFileNameWithoutExtension(path);
            string[] lines = File.ReadAllLines(path);
            //File.ReadAllText(path);

            List <IElement> elements         = MsgParser.ParseFile(lines, Name);
            int             serviceSeparator = elements.FindIndex(x => x.Type == ElementType.ServiceSeparator);

            if (serviceSeparator == -1)
            {
                throw new MessageParseException("Service file has no separator");
            }

            elementsReq  = elements.GetRange(0, serviceSeparator).ToArray();
            elementsResp = elements.GetRange(serviceSeparator + 1, elements.Count - serviceSeparator - 1).ToArray();

            variablesReq  = elementsReq.OfType <VariableElement>().ToArray();
            variablesResp = elementsResp.OfType <VariableElement>().ToArray();
        }
Esempio n. 3
0
        internal VariableElement(string comment, string rosClassToken, string fieldName,
                                 string?parentClassName   = null,
                                 ClassInfo?classInfo      = null,
                                 bool serializeAsProperty = false
                                 )
        {
            Comment                  = comment;
            this.rosClassToken       = rosClassToken;
            this.serializeAsProperty = serializeAsProperty;

            RosFieldName = fieldName;

            CsFieldName = MsgParser.CsIfy(fieldName);
            if (CsFieldName == parentClassName)
            {
                CsFieldName += "_"; // C# forbids fields with the same name as the class
            }

            if (Keywords.Contains(fieldName))
            {
                CsFieldName = $"@{fieldName}";
            }

            int bracketLeft  = rosClassToken.IndexOf('[');
            int bracketRight = rosClassToken.IndexOf(']');

            if (bracketLeft != -1 && bracketRight != -1)
            {
                RosClassName = rosClassToken.Substring(0, bracketLeft);
                string arrayLengthStr = rosClassToken.Substring(bracketLeft + 1, bracketRight - bracketLeft - 1);

                if (string.IsNullOrWhiteSpace(arrayLengthStr))
                {
                    ArraySize = DynamicSizeArray;
                }
                else if (int.TryParse(arrayLengthStr, out int arraySize))
                {
                    ArraySize = arraySize;
                }
                else
                {
                    //TODO: error!
                    ArraySize = NotAnArray;
                }
            }
            else
            {
                RosClassName = rosClassToken;
                ArraySize    = NotAnArray;
            }

            int slashIndex;

            if (RosClassName == "Header")
            {
                RosClassName = "std_msgs/Header";
                CsClassName  = "StdMsgs.Header";
            }
            else if (MsgParser.BuiltInsMaps.TryGetValue(RosClassName, out string?className))
            {
                CsClassName = className;
            }
            else if ((slashIndex = RosClassName.IndexOf('/')) != -1)
            {
                string packageName = RosClassName.Substring(0, slashIndex);
                string classProper = RosClassName.Substring(slashIndex + 1);
                CsClassName = $"{MsgParser.CsIfy(packageName)}.{classProper}";
            }
            else
            {
                CsClassName = RosClassName;
            }

            ClassInfo = classInfo;
        }