/// <summary> /// Parses the supplied arguments. Logs errors for unrecognized, duplicate or missing arguments. /// </summary> /// <param name="argumentInstances">A list of argument instances that have been recognized</param> public bool ParseArguments(string[] commandLineArgs, ILogger logger, out IEnumerable <ArgumentInstance> argumentInstances) { if (commandLineArgs == null) { throw new ArgumentNullException(nameof(commandLineArgs)); } if (logger == null) { throw new ArgumentNullException(nameof(logger)); } var parsedOk = true; // List of values that have been recognized IList <ArgumentInstance> recognized = new List <ArgumentInstance>(); foreach (var arg in commandLineArgs) { if (TryGetMatchingDescriptor(arg, out var descriptor, out var prefix)) { var newId = descriptor.Id; if (!descriptor.AllowMultiple && IdExists(newId, recognized)) { ArgumentInstance.TryGetArgumentValue(newId, recognized, out var existingValue); logger.LogError(Resources.ERROR_CmdLine_DuplicateArg, arg, existingValue); parsedOk = false; } else { // Store the argument var argValue = arg.Substring(prefix.Length); recognized.Add(new ArgumentInstance(descriptor, argValue)); } }
/// <summary> /// Attempts to construct and return a file-based properties provider /// </summary> /// <param name="defaultPropertiesFileDirectory">Directory in which to look for the default properties file (optional)</param> /// <param name="commandLineArguments">List of command line arguments (optional)</param> /// <returns>False if errors occurred when constructing the provider, otherwise true</returns> /// <remarks>If a properties file could not be located then an empty provider will be returned</remarks> public static bool TryCreateProvider(IEnumerable <ArgumentInstance> commandLineArguments, string defaultPropertiesFileDirectory, ILogger logger, out IAnalysisPropertyProvider provider) { if (commandLineArguments == null) { throw new ArgumentNullException(nameof(commandLineArguments)); } if (string.IsNullOrWhiteSpace(defaultPropertiesFileDirectory)) { throw new ArgumentNullException(nameof(defaultPropertiesFileDirectory)); } if (logger == null) { throw new ArgumentNullException(nameof(logger)); } // If the path to a properties file was specified on the command line, use that. // Otherwise, look for a default properties file in the default directory. var settingsFileArgExists = ArgumentInstance.TryGetArgumentValue(DescriptorId, commandLineArguments, out var propertiesFilePath); if (ResolveFilePath(propertiesFilePath, defaultPropertiesFileDirectory, logger, out var locatedPropertiesFile)) { if (locatedPropertiesFile == null) { provider = EmptyPropertyProvider.Instance; } else { provider = new FilePropertyProvider(locatedPropertiesFile, !settingsFileArgExists); } return(true); } provider = null; return(false); }