public VerbExecutor CreateStandardVerbExecutor(IEnumerable <string> arguments)
        {
            VerbExecutor verbExecutor = null;

            var p = Parser.Default.ParseArguments(
                arguments,
                typeof(SignVerb),
                typeof(PackVerb),
                typeof(UnpackVerb),
                typeof(NewCertVerb),
                typeof(TrustVerb),
                typeof(AppAttachVerb),
                typeof(NewModPackVerb),
                typeof(ExtractCertVerb),
                typeof(DependenciesVerb),
                typeof(UpdateImpactVerb),
                typeof(EditVerbPlaceholder));

            p.WithParsed <SignVerb>(verb =>
            {
                verbExecutor = new SignVerbExecutor(verb, new SigningManager(MsixHeroGistTimeStampFeed.CreateCached()), new LocalConfigurationService(), this.console);
            });

            p.WithParsed <PackVerb>(verb =>
            {
                verbExecutor = new PackVerbExecutor(verb, this.console);
            });

            p.WithParsed <UnpackVerb>(verb =>
            {
                verbExecutor = new UnpackVerbExecutor(verb, this.console);
            });

            p.WithParsed <NewCertVerb>(verb =>
            {
                verbExecutor = new NewCertVerbExecutor(verb, new SigningManager(MsixHeroGistTimeStampFeed.CreateCached()), this.console);
            });

            p.WithParsed <NewModPackVerb>(verb =>
            {
                verbExecutor = new NewModPackVerbExecutor(verb, new ModificationPackageBuilder(new AppxPacker()), this.console);
            });

            p.WithParsed <TrustVerb>(verb =>
            {
                verbExecutor = new TrustVerbExecutor(verb, new SigningManager(MsixHeroGistTimeStampFeed.CreateCached()), this.console);
            });

            p.WithParsed <ExtractCertVerb>(verb =>
            {
                verbExecutor = new ExtractCertVerbExecutor(verb, new SigningManager(MsixHeroGistTimeStampFeed.CreateCached()), this.console);
            });

            p.WithParsed <AppAttachVerb>(verb =>
            {
                verbExecutor = new AppAttachVerbExecutor(verb, new AppAttachManager(new SigningManager(MsixHeroGistTimeStampFeed.CreateCached()), new LocalConfigurationService()), this.console);
            });

            p.WithParsed <UpdateImpactVerb>(verb =>
            {
                verbExecutor = new UpdateImpactVerbExecutor(verb, this.console);
            });

            p.WithParsed <DependenciesVerb>(verb =>
            {
                verbExecutor = new DependenciesVerbExecutor(verb, this.console);
            });

            p.WithParsed <EditVerbPlaceholder>(_ => Task.FromResult(0));

            p.WithNotParsed(arg =>
            {
                var err = arg.FirstOrDefault();
                if (err != null)
                {
                    Environment.ExitCode = (int)err.Tag;
                }
                else
                {
                    Environment.ExitCode = StandardExitCodes.ErrorGeneric;
                }
            });

            return(verbExecutor);
        }
        public VerbExecutor CreateEditVerbExecutor(string packagePath, IEnumerable <string> arguments, bool inBulkMode = false)
        {
            var p = GetEditParser(arguments, inBulkMode);

            VerbExecutor verbExecutor = null;

            p.WithParsed <DeleteFileEditVerb>(verb =>
            {
                verbExecutor = new DeleteFileEditVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <AddCapabilityVerb>(verb =>
            {
                verbExecutor = new AddCapabilityVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <SetIdentityEditVerb>(verb =>
            {
                verbExecutor = new SetIdentityVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <SetPropertiesEditVerb>(verb =>
            {
                verbExecutor = new SetPropertiesVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <SetBuildMetaDataVerb>(verb =>
            {
                verbExecutor = new SetBuildMetaDataVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <AddFileEditVerb>(verb =>
            {
                verbExecutor = new AddFileEditVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <ImportRegistryEditVerb>(verb =>
            {
                verbExecutor = new ImportRegistryVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <SetRegistryKeyEditVerb>(verb =>
            {
                verbExecutor = new SetRegistryKeyVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <SetRegistryValueEditVerb>(verb =>
            {
                verbExecutor = new SetRegistryValueVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <DeleteRegistryKeyEditVerb>(verb =>
            {
                verbExecutor = new DeleteRegistryKeyVerbExecutor(packagePath, verb, this.console);
            });

            p.WithParsed <DeleteRegistryValueEditVerb>(verb =>
            {
                verbExecutor = new DeleteRegistryValueVerbExecutor(packagePath, verb, this.console);
            });

            if (!inBulkMode)
            {
                p.WithParsed <ListEditVerb>(verb =>
                {
                    verbExecutor = new ListEditVerbExecutor(packagePath, verb, this.console);
                });
            }

            return(verbExecutor);
        }