/// <summary> /// This Factory method, converting the input string list to the /// a list of CommandInputOutput object which contains /// string type of commands, actual type of command and a string of report. /// the string part used for print input data. /// </summary> /// <param name="commandsStringList">list of string commands.Each line could have more than one command.</param> /// <returns>list of CommandInputOutput object</returns> public static List <CommandsInputOutPutData> GenerateOutputListOfCommands(List <string> commandsStringList) { //the output of function List <CommandsInputOutPutData> lstCommand = new List <CommandsInputOutPutData>(); //this list will capture all index of Place commands List <int> AllPlaceCommandIndexes = new List <int>(); // start index is from the first Place command in the list int startListIndex = 0; //this tag checks the first finded Place command HasPlacedCommandbeenSeenFirst = false; try { foreach (var fileLineCommands in commandsStringList) { // this match is for fetching all valid command from the command Rules // more than one command in line is acceptable var matchedLineList = CommandRules.CommandsPattern().Matches(fileLineCommands) .Cast <Match>().Select(m => m.Value).ToList(); if (matchedLineList.Count == 0) { continue; } //filling the list of all Place command Indexes for define the command in command generator AllPlaceCommandIndexes = matchedLineList.Where(mat => CommandRules.PlaceCommandPattern().Match(mat).Success). Select <string, int>(x => matchedLineList.IndexOf(x)).ToList(); if (!HasPlacedCommandbeenSeenFirst) { // if there is no Place command if (AllPlaceCommandIndexes.Count == 0) { continue; } HasPlacedCommandbeenSeenFirst = true; startListIndex = AllPlaceCommandIndexes[0]; } else { startListIndex = 0; } // this loop is for generating all commands in each line and adding it to the list for (int i = startListIndex; i < matchedLineList.Count; i++) { var generatedCommand = CommandGenerator(matchedLineList[i], AllPlaceCommandIndexes.Contains(i)); if (generatedCommand == null) { continue; } //this is the output object for beneficial output print var outputData = new CommandsInputOutPutData() { CommandAsString = matchedLineList[i], CommandAsType = generatedCommand, ReportOfRobot = "" }; lstCommand.Add(outputData); } } } catch (Exception) { var outputData = new CommandsInputOutPutData() { CommandAsString = "", CommandAsType = null, ReportOfRobot = " wrong Data to parse" }; lstCommand.Add(outputData); } return(lstCommand); }