private static bool ParseFilesAndFilterArgs()

in src/testing/runner/Program.cs [100:199]


        private static bool ParseFilesAndFilterArgs(string[] args, out IList<FileInfo> files, out IList<string> filters)
        {
            var filesAsList = new List<FileInfo>();
            files = filesAsList;
            filters = new List<string>();

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] == "--file" || args[i] == "--files")
                {
                    if (i + 1 >= args.Length || args[i + 1].StartsWith("--"))
                    {
                        Console.WriteLine($"Expected a file or pattern after '{args[i]}'.");
                        return false;
                    }

                    do
                    {
                        i++;
                        var pattern = args[i];
                        var found = FindFiles(pattern);
                        if (found.Count() == 0)
                        {
                            Console.WriteLine($"No files found for pattern '{pattern}'.");
                            return false;
                        }

                        filesAsList.AddRange(found);
                    }
                    while (i + 1 < args.Length && !args[i + 1].StartsWith("--"));
                }
                else if (args[i] == "--search")
                {
                    if (i + 1 >= args.Length || args[i + 1].StartsWith("--"))
                    {
                        Console.WriteLine($"Expected text after '{args[i]}'.");
                        return false;
                    }

                    do
                    {
                        i++;
                        filters.Add(args[i]);
                    }
                    while (i + 1 < args.Length && !args[i + 1].StartsWith("--"));
                }
                else if (args[i] == "--test" || args[i] == "--tests")
                {
                    if (i + 1 >= args.Length || args[i + 1].StartsWith("--"))
                    {
                        Console.WriteLine($"Expected text after '{args[i]}'.");
                        return false;
                    }

                    do
                    {
                        i++;
                        filters.Add(args[i]);
                    }
                    while (i + 1 < args.Length && !args[i + 1].StartsWith("--"));
                }
                else if (args[i] == "--contains")
                {
                    if (i + 1 >= args.Length || args[i + 1].StartsWith("--"))
                    {
                        Console.WriteLine($"Expected text after '{args[i]}'.");
                        return false;
                    }

                    do
                    {
                        i++;
                        filters.Add($"+{args[i]}"); // `+` means MUST contain text
                    }
                    while (i + 1 < args.Length && !args[i + 1].StartsWith("--"));
                }
                else if (args[i] == "--remove")
                {
                    if (i + 1 >= args.Length || args[i + 1].StartsWith("--"))
                    {
                        Console.WriteLine($"Expected text after '{args[i]}'.");
                        return false;
                    }

                    do
                    {
                        i++;
                        filters.Add($"-{args[i]}"); // `-` means MUST NOT contain text
                    }
                    while (i + 1 < args.Length && !args[i + 1].StartsWith("--"));
                }
                else
                {
                    Console.WriteLine($"Invalid command line argument at '{args[i]}'.");
                    return false;
                }
            }

            return true;
        }