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; }
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(); }
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; }