public static CommandResult RemoveCommand(CommandLineProto proto, CommandLine args)
 {
     try
     {
         var  app       = ConsoleApp.Instance;
         var  options   = GetPathFolderOptions(args);
         bool isVerbose = args.HasSwitch(Names.VerboseSwitch, Names.VerboseMnemonic);
         bool isQuiet   = args.HasSwitch(Names.QuietSwitch, Names.QuietMnemonic);
         var  folders   = new PathFolders(options);
         bool commit    = true;
         folders.Fill();
         int defaultPos = proto.GetValue <int>(Names.PositionSwitch);
         int pos        = args.GetValue <int>(Names.PositionSwitch, Names.PositionMnemonic, defaultPos);
         int defaultLen = proto.GetValue <int>(Names.LengthSwitch);
         int len        = args.GetValue <int>(Names.LengthSwitch, Names.LengthMnemonic, defaultLen);
         if (pos < 1 || pos + len - 1 > folders.Count)
         {
             throw new ApplicationException("Position and length outside valid range for remove operation");
         }
         if (!isQuiet)
         {
             app.WriteError(isVerbose ? folders.ToVerboseString() : folders.ToString());
             app.WriteError();
             commit = app.GetConfirmation($"Remove {len} folder(s) from PATH starting at position {pos}?");
             app.WriteError();
         }
         if (commit)
         {
             int l = len;
             while (l-- > 0)
             {
                 folders.RemoveAt(pos - 1);
             }
         }
         if (options == PathFolderOptions.Process)
         {
             app.WriteOut(folders.ToInlineString());
         }
         else if (commit)
         {
             folders.Commit();
         }
         if (commit)
         {
             return(new CommandResult(true, $"{len} folder(s) removed from PATH"));
         }
         else
         {
             return(new CommandResult(false, "Remove operation canceled"));
         }
     }
     catch (Exception ex)
     {
         return(new CommandResult(false, "Unable to remove folders from PATH", ex));
     }
 }
        public static CommandResult ListCommand(CommandLineProto proto, CommandLine args)
        {
            var app = ConsoleApp.Instance;

            try
            {
                PathFolderOptions options = GetPathFolderOptions(args);
                PathFolders       folders = new PathFolders(options);
                folders.Fill();
                var    f0      = folders.ToArray();
                string pattern = args.GetResolvedValue <string>(Names.FilterSwitch, Names.FilterMnemonic);
                if (pattern != null)
                {
                    Regex r = new Regex(pattern);
                    f0 = (from f in f0 where r.IsMatch(f.Path) select f).ToArray();
                }
                if (args.HasSwitch(Names.SortSwitch))
                {
                    Array.Sort(f0);
                }
                folders = new PathFolders(f0);
                bool isVerbose = args.HasSwitch(Names.VerboseSwitch, Names.VerboseMnemonic);
                bool isInline  = args.HasSwitch(Names.InlineSwitch, Names.InlineMnemonic);
                if (isVerbose && isInline)
                {
                    return(new CommandResult(false, "--Verbose and --Inline are incompatible options"));
                }
                if (!isInline)
                {
                    app.WriteOut(isVerbose ? folders.ToVerboseString() : folders.ToString());
                }
                else
                {
                    app.WriteOut(folders.ToInlineString());
                }
                return(new CommandResult());
            }
            catch (Exception ex)
            {
                return(new CommandResult(false, "Unable to list PATH elements", ex));
            }
        }
        public static CommandResult CleanCommand(CommandLineProto proto, CommandLine args)
        {
            var app = ConsoleApp.Instance;

            try
            {
                PathFolderOptions options   = GetPathFolderOptions(args);
                CommandResult     result    = new CommandResult();
                PathFolders       foriginal = new PathFolders(options);
                PathFolders       fvalid    = new PathFolders(options);
                PathFolders       finvalid  = new PathFolders(options);
                bool isVerbose = args.HasSwitch(Names.VerboseSwitch, Names.VerboseMnemonic);
                bool isQuiet   = args.HasSwitch(Names.QuietSwitch, Names.QuietMnemonic);
                bool commit    = true;
                foriginal.Fill();
                foreach (PathFolder f0 in foriginal)
                {
                    if (f0.IsValid)
                    {
                        fvalid.Add(f0);
                    }
                    else
                    {
                        finvalid.Add(f0);
                    }
                }
                if (finvalid.Count == 0)
                {
                    if (options == PathFolderOptions.Process)
                    {
                        app.WriteOut(fvalid.ToInlineString());
                    }
                    return(new CommandResult(true, "No invalid folders in path"));
                }
                if (!isQuiet)
                {
                    app.WriteError(isVerbose ? finvalid.ToVerboseString() : finvalid.ToString());
                    commit = app.GetConfirmation("Remove folders from PATH?");
                    app.WriteError();
                }
                if (options == PathFolderOptions.Process && commit)
                {
                    app.WriteOut(fvalid.ToInlineString());
                }
                else if (options == PathFolderOptions.Process)
                {
                    app.WriteOut(foriginal.ToInlineString());
                }
                else if (commit)
                {
                    fvalid.Commit();
                }
                if (commit)
                {
                    return(new CommandResult(true, $"{finvalid.Count} folder(s) removed from PATH"));
                }
                else
                {
                    return(new CommandResult(false, "User canceled operation"));
                }
            }
            catch (Exception ex)
            {
                return(new CommandResult(false, "Unable to clean invalid PATH elements", ex));
            }
        }
        public static CommandResult AddCommand(CommandLineProto proto, CommandLine args)
        {
            var app = ConsoleApp.Instance;

            try
            {
                int  defaultPos = proto.GetValue <int>(Names.PositionSwitch);
                int  pos        = args.GetValue <int>(Names.PositionSwitch, Names.PositionMnemonic, defaultPos);
                var  options    = GetPathFolderOptions(args);
                bool isVerbose  = args.HasSwitch(Names.VerboseSwitch, Names.VerboseMnemonic);
                bool isQuiet    = args.HasSwitch(Names.QuietSwitch, Names.QuietMnemonic);
                var  folders    = new PathFolders(options);
                folders.Fill();
                var    added  = new PathFolders(options);
                int    parg   = 2;
                string path   = args.GetResolvedValue <string>(parg++);
                bool   commit = true;
                while (path != null)
                {
                    added.Add(new PathFolder(path));
                    path = args.GetResolvedValue <string>(parg++);
                }
                if (!isQuiet)
                {
                    app.WriteError();
                    app.WriteError("Add...");
                    app.WriteError();
                    app.WriteError(added.ToString(), false);
                    app.WriteError();
                    app.WriteError("to...");
                    app.WriteError();
                    app.WriteError(isVerbose ? folders.ToVerboseString() : folders.ToString());
                    app.WriteError();
                    commit = app.GetConfirmation($"at position {pos}?");
                    app.WriteError();
                }
                if (commit)
                {
                    int p = pos - 1;
                    foreach (var f in added)
                    {
                        folders.Insert(p++, f);
                    }
                }
                if (options == PathFolderOptions.Process)
                {
                    app.WriteOut(folders.ToInlineString());
                }
                else if (commit)
                {
                    folders.Commit();
                }
                if (commit)
                {
                    return(new CommandResult(true, $"{added.Count} folder(s) added to PATH at position {pos}"));
                }
                else
                {
                    return(new CommandResult(false, "Add folders operation canceled"));
                }
            }
            catch (Exception ex)
            {
                return(new CommandResult(false, "Unable to add folders to command", ex));
            }
        }
        public static CommandResult MoveCommand(CommandLineProto proto, CommandLine args)
        {
            CommandResult result = new CommandResult();

            try
            {
                var  app       = ConsoleApp.Instance;
                var  options   = GetPathFolderOptions(args);
                bool isVerbose = args.HasSwitch(Names.VerboseSwitch, Names.VerboseMnemonic);
                bool isQuiet   = args.HasSwitch(Names.QuietSwitch, Names.QuietMnemonic);
                var  folders   = new PathFolders(options);
                bool commit    = true;
                folders.Fill();
                int defaultPos    = proto.GetValue <int>(Names.PositionSwitch);
                int pos           = args.GetValue <int>(Names.PositionSwitch, Names.PositionMnemonic, defaultPos);
                int defaultLength = proto.GetValue <int>(Names.LengthSwitch);
                int len           = args.GetValue <int>(Names.LengthSwitch, Names.LengthMnemonic, defaultLength);
                int defaultTo     = proto.GetValue <int>(Names.ToSwitch);
                int to            = args.GetValue <int>(Names.ToSwitch, Names.ToMnemonic, defaultTo);
                if (pos < 1 || pos + len - 1 > folders.Count)
                {
                    throw new ApplicationException("Position and length outside valid range for move operation");
                }
                if (to < 1 || to > folders.Count)
                {
                    throw new ApplicationException("Move to position outside valid range");
                }
                if (pos == to)
                {
                    throw new ApplicationException("The source position and the destination position are the same");
                }
                if (!isQuiet)
                {
                    app.WriteError(isVerbose ? folders.ToVerboseString() : folders.ToString());
                    app.WriteError();
                    commit = app.GetConfirmation($"Move {len} folder(s) in PATH starting at position {pos} to position {to}?");
                    app.WriteError();
                }
                if (commit)
                {
                    int l = len;
                    int p = pos - 1;
                    int t = to - 1;
                    while (l-- > 0)
                    {
                        if (t < p)
                        {
                            folders.Insert(t, folders[p]);
                            folders.RemoveAt(p + 1);
                            ++p;
                            ++t;
                        }
                        else
                        {
                            folders.Insert(t + len, folders[p]);
                            folders.RemoveAt(p);
                        }
                    }
                }
                if (options == PathFolderOptions.Process)
                {
                    app.WriteOut(folders.ToInlineString());
                }
                else if (commit)
                {
                    folders.Commit();
                }
                if (commit)
                {
                    return(new CommandResult(true, $"{len} folders moved from position {pos} to position {to} in PATH"));
                }
                else
                {
                    return(new CommandResult(false, "Move operation canceled"));
                }
            }
            catch (Exception ex)
            {
                return(new CommandResult(false, "Unable to move folders in PATH", ex));
            }
        }