public ListProjectToProjectReferencesCommand(
            AppliedOption appliedCommand,
            ParseResult parseResult) : base()
        {
            if (appliedCommand == null)
            {
                throw new ArgumentNullException(nameof(appliedCommand));
            }
            if (parseResult == null)
            {
                throw new ArgumentNullException(nameof(parseResult));
            }

            // If showing help, replace the parent's argument rule so that this command's argument
            // only shows `PROJECT` instead of `PROJECT | SOLUTION`.
            if (parseResult.AppliedCommand().IsHelpRequested() &&
                (parseResult.Command().Parent is ListCommandParser.ListCommand parent))
            {
                parent.SetArgumentsRule(
                    Accept.ZeroOrOneArgument()
                    .With(
                        name: CommonLocalizableStrings.ProjectArgumentName,
                        description: CommonLocalizableStrings.ProjectArgumentDescription)
                    .DefaultToCurrentDirectory()
                    );
            }

            ShowHelpOrErrorIfAppropriate(parseResult);

            _fileOrDirectory = appliedCommand.Arguments.Single();
        }
예제 #2
0
 public static Command ListPackageReferences() => Create.Command(
     "package",
     LocalizableStrings.AppFullName,
     Accept.ZeroOrOneArgument(),
     CommonOptions.HelpOption(),
     Create.Option("--outdated",
                   LocalizableStrings.CmdOutdatedDescription),
     Create.Option("--framework",
                   LocalizableStrings.CmdFrameworkDescription,
                   Accept.OneOrMoreArguments()
                   .With(name: LocalizableStrings.CmdFramework)
                   .ForwardAsSingle(o => $"--framework {string.Join("%3B", o.Arguments)}")),
     Create.Option("--include-transitive",
                   LocalizableStrings.CmdTransitiveDescription),
     Create.Option("--include-prerelease",
                   LocalizableStrings.CmdPrereleaseDescription),
     Create.Option("--highest-patch",
                   LocalizableStrings.CmdHighestPatchDescription),
     Create.Option("--highest-minor",
                   LocalizableStrings.CmdHighestMinorDescription),
     Create.Option("--config",
                   LocalizableStrings.CmdConfigDescription,
                   Accept.ExactlyOneArgument()
                   .With(name: LocalizableStrings.CmdConfig)
                   .ForwardAsSingle(o => $"--config {o.Arguments.Single()}")),
     Create.Option("--source",
                   LocalizableStrings.CmdSourceDescription,
                   Accept.OneOrMoreArguments()
                   .With(name: LocalizableStrings.CmdSource)
                   .ForwardAsSingle(o => $"--source {string.Join("%3B", o.Arguments)}")));
예제 #3
0
 public static Command Migrate() =>
 Create.Command(
     "migrate",
     ".NET Migrate Command",
     Accept.ZeroOrOneArgument()
     .MaterializeAs(o =>
                    new MigrateCommand(
                        o.ValueOrDefault <string>("--template-file"),
                        o.Arguments.FirstOrDefault(),
                        o.ValueOrDefault <string>("--sdk-package-version"),
                        o.ValueOrDefault <string>("--xproj-file"),
                        o.ValueOrDefault <string>("--report-file"),
                        o.ValueOrDefault <bool>("--skip-project-references"),
                        o.ValueOrDefault <bool>("--format-report-file-json"),
                        o.ValueOrDefault <bool>("--skip-backup")))
     .With(name: LocalizableStrings.CmdProjectArgument,
           description: LocalizableStrings.CmdProjectArgumentDescription),
     CommonOptions.HelpOption(),
     Create.Option("-t|--template-file",
                   LocalizableStrings.CmdTemplateDescription),
     Create.Option("-v|--sdk-package-version",
                   LocalizableStrings.CmdVersionDescription),
     Create.Option("-x|--xproj-file",
                   LocalizableStrings.CmdXprojFileDescription),
     Create.Option("-s|--skip-project-references",
                   LocalizableStrings.CmdSkipProjectReferencesDescription),
     Create.Option("-r|--report-file",
                   LocalizableStrings.CmdReportFileDescription),
     Create.Option("--format-report-file-json",
                   LocalizableStrings.CmdReportOutputDescription),
     Create.Option("--skip-backup",
                   LocalizableStrings.CmdSkipBackupDescription));
예제 #4
0
 public static Command ToolRestore()
 {
     return(Create.Command(
                "restore",
                LocalizableStrings.CommandDescription,
                Accept.NoArguments(),
                Create.Option(
                    "--configfile",
                    LocalizableStrings.ConfigFileOptionDescription,
                    Accept.ExactlyOneArgument()
                    .With(name: LocalizableStrings.ConfigFileOptionName)),
                Create.Option(
                    "--add-source",
                    LocalizableStrings.AddSourceOptionDescription,
                    Accept.OneOrMoreArguments()
                    .With(name: LocalizableStrings.AddSourceOptionName)),
                Create.Option(
                    "--tool-manifest",
                    LocalizableStrings.ManifestPathOptionDescription,
                    Accept.ZeroOrOneArgument()
                    .With(name: LocalizableStrings.ManifestPathOptionName)),
                ToolCommandRestorePassThroughOptions.DisableParallelOption(),
                ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption(),
                ToolCommandRestorePassThroughOptions.NoCacheOption(),
                ToolCommandRestorePassThroughOptions.InteractiveRestoreOption(),
                CommonOptions.HelpOption(),
                CommonOptions.VerbosityOption()));
 }
예제 #5
0
 public static Command Migrate() =>
 Create.Command(
     "migrate",
     ".NET Migrate Command",
     Accept.ZeroOrOneArgument()
     .With(name: LocalizableStrings.CmdProjectArgument,
           description: LocalizableStrings.CmdProjectArgumentDescription),
     CommonOptions.HelpOption(),
     Create.Option("-t|--template-file",
                   LocalizableStrings.CmdTemplateDescription,
                   Accept.ExactlyOneArgument()),
     Create.Option("-v|--sdk-package-version",
                   LocalizableStrings.CmdVersionDescription,
                   Accept.ExactlyOneArgument()),
     Create.Option("-x|--xproj-file",
                   LocalizableStrings.CmdXprojFileDescription,
                   Accept.ExactlyOneArgument()),
     Create.Option("-s|--skip-project-references",
                   LocalizableStrings.CmdSkipProjectReferencesDescription),
     Create.Option("-r|--report-file",
                   LocalizableStrings.CmdReportFileDescription,
                   Accept.ExactlyOneArgument()),
     Create.Option("--format-report-file-json",
                   LocalizableStrings.CmdReportOutputDescription),
     Create.Option("--skip-backup",
                   LocalizableStrings.CmdSkipBackupDescription));
예제 #6
0
        // Creates a command setup with the args for "new", plus args for the input template parameters.
        public static Command CreateNewCommandWithArgsForTemplate(string commandName, string templateName,
                                                                  IReadOnlyList <ITemplateParameter> parameterDefinitions,
                                                                  IDictionary <string, string> longNameOverrides,
                                                                  IDictionary <string, string> shortNameOverrides,
                                                                  out IReadOnlyDictionary <string, IReadOnlyList <string> > templateParamMap)
        {
            IList <Option>   paramOptionList       = new List <Option>();
            HashSet <string> initiallyTakenAliases = ArgsForBuiltInCommands;

            Dictionary <string, IReadOnlyList <string> > canonicalToVariantMap = new Dictionary <string, IReadOnlyList <string> >();
            AliasAssignmentCoordinator assignmentCoordinator = new AliasAssignmentCoordinator(parameterDefinitions, longNameOverrides, shortNameOverrides, initiallyTakenAliases);

            if (assignmentCoordinator.InvalidParams.Count > 0)
            {
                string unusableDisplayList = string.Join(", ", assignmentCoordinator.InvalidParams);
                throw new Exception($"Template is malformed. The following parameter names are invalid: {unusableDisplayList}");
            }

            foreach (ITemplateParameter parameter in parameterDefinitions.Where(x => x.Priority != TemplateParameterPriority.Implicit))
            {
                Option         option;
                IList <string> aliasesForParam = new List <string>();

                if (assignmentCoordinator.LongNameAssignments.TryGetValue(parameter.Name, out string longVersion))
                {
                    aliasesForParam.Add(longVersion);
                }

                if (assignmentCoordinator.ShortNameAssignments.TryGetValue(parameter.Name, out string shortVersion))
                {
                    aliasesForParam.Add(shortVersion);
                }

                if (string.Equals(parameter.DataType, "choice", StringComparison.OrdinalIgnoreCase))
                {
                    option = Create.Option(string.Join("|", aliasesForParam), parameter.Documentation,
                                           Accept.ExactlyOneArgument());
                    //.WithSuggestionsFrom(parameter.Choices.Keys.ToArray())
                    // Don't give this a default value, otherwise the switch without a value is valid (gets set to the default)
                    // User should have to give a value, or not specify the switch - which causes the default to be applied.
                }
                else if (string.Equals(parameter.DataType, "bool", StringComparison.OrdinalIgnoreCase))
                {
                    option = Create.Option(string.Join("|", aliasesForParam), parameter.Documentation,
                                           Accept.ZeroOrOneArgument()
                                           .WithSuggestionsFrom(new[] { "true", "false" }));
                }
                else
                {
                    option = Create.Option(string.Join("|", aliasesForParam), parameter.Documentation,
                                           Accept.ExactlyOneArgument());
                }

                paramOptionList.Add(option);                                         // add the option
                canonicalToVariantMap.Add(parameter.Name, aliasesForParam.ToList()); // map the template canonical name to its aliases.
            }

            templateParamMap = canonicalToVariantMap;
            return(GetNewCommandForTemplate(commandName, templateName, NewCommandVisibleArgs, NewCommandHiddenArgs, DebuggingCommandArgs, paramOptionList.ToArray()));
        }
예제 #7
0
 public static Command ToolUninstall()
 {
     return(Create.Command("uninstall",
                           LocalizableStrings.CommandDescription,
                           Accept.ExactlyOneArgument(errorMessage: o => LocalizableStrings.SpecifyExactlyOnePackageId)
                           .With(name: LocalizableStrings.PackageIdArgumentName,
                                 description: LocalizableStrings.PackageIdArgumentDescription),
                           Create.Option(
                               $"-g|--{ToolAppliedOption.GlobalOption}",
                               LocalizableStrings.GlobalOptionDescription,
                               Accept.NoArguments()),
                           Create.Option(
                               $"--{ToolAppliedOption.LocalOption}",
                               LocalizableStrings.LocalOptionDescription,
                               Accept.NoArguments()),
                           Create.Option(
                               $"--{ToolAppliedOption.ToolPathOption}",
                               LocalizableStrings.ToolPathOptionDescription,
                               Accept.ExactlyOneArgument()
                               .With(name: LocalizableStrings.ToolPathOptionName)),
                           Create.Option(
                               $"--{ToolAppliedOption.ToolManifest}",
                               LocalizableStrings.ManifestPathOptionDescription,
                               Accept.ZeroOrOneArgument()
                               .With(name: LocalizableStrings.ManifestPathOptionName)),
                           CommonOptions.HelpOption()));
 }
예제 #8
0
 public static Command Publish() =>
 CreateWithRestoreOptions.Command(
     "publish",
     LocalizableStrings.AppDescription,
     Accept.ZeroOrMoreArguments(),
     CommonOptions.HelpOption(),
     Create.Option(
         "-o|--output",
         LocalizableStrings.OutputOptionDescription,
         Accept.ExactlyOneArgument()
         .With(name: LocalizableStrings.OutputOption)
         .ForwardAsSingle(o => $"/p:PublishDir={o.Arguments.Single()}")),
     CommonOptions.FrameworkOption(),
     CommonOptions.RuntimeOption(),
     CommonOptions.ConfigurationOption(),
     CommonOptions.VersionSuffixOption(),
     Create.Option(
         "--manifest",
         LocalizableStrings.ManifestOptionDescription,
         Accept.OneOrMoreArguments()
         .With(name: LocalizableStrings.ManifestOption)
         .ForwardAsSingle(o => $"/p:TargetManifestFiles={string.Join("%3B", o.Arguments)}")),
     Create.Option(
         "--self-contained",
         LocalizableStrings.SelfContainedOptionDescription,
         Accept.ZeroOrOneArgument()
         .WithSuggestionsFrom("true", "false")
         .ForwardAsSingle(o =>
 {
     string value = o.Arguments.Any() ? o.Arguments.Single() : "true";
     return($"/p:SelfContained={value}");
 })),
     CommonOptions.NoRestoreOption(),
     CommonOptions.VerbosityOption());
 public static Command ListProjectToProjectReferences()
 {
     return(Create.Command(
                "reference",
                LocalizableStrings.AppFullName,
                Accept.ZeroOrOneArgument(),
                CommonOptions.HelpOption()));
 }
예제 #10
0
 public static Command List() => Create.Command(
     "list",
     LocalizableStrings.NetListCommand,
     Accept.ZeroOrOneArgument()
     .With(
         name: CommonLocalizableStrings.ProjectArgumentName,
         description: CommonLocalizableStrings.ProjectArgumentDescription)
     .DefaultToCurrentDirectory(),
     CommonOptions.HelpOption(),
     ListProjectToProjectReferencesCommandParser.ListProjectToProjectReferences());
예제 #11
0
 public static Command Help()
 {
     return(Create.Command(
                "help",
                LocalizableStrings.AppFullName,
                Accept.ZeroOrOneArgument()
                .With(
                    LocalizableStrings.CommandArgumentDescription,
                    LocalizableStrings.CommandArgumentName),
                CommonOptions.HelpOption()));
 }
예제 #12
0
        public void By_default_an_option_with_zero_or_one_argument_materializes_as_the_argument_string_value_by_default()
        {
            var command = Command("the-command", "",
                                  Option("-x", "", Accept.ZeroOrOneArgument()));

            var result = command.Parse("the-command -x the-argument");

            result["the-command"]["x"]
            .Value()
            .Should()
            .Be("the-argument");
        }
예제 #13
0
 public static Command ToolInstall()
 {
     return(Create.Command("install",
                           LocalizableStrings.CommandDescription,
                           Accept.ExactlyOneArgument(errorMessage: o => LocalizableStrings.SpecifyExactlyOnePackageId)
                           .With(name: LocalizableStrings.PackageIdArgumentName,
                                 description: LocalizableStrings.PackageIdArgumentDescription),
                           Create.Option(
                               $"-g|--{ToolAppliedOption.GlobalOption}",
                               LocalizableStrings.GlobalOptionDescription,
                               Accept.NoArguments()),
                           Create.Option(
                               $"--{ToolAppliedOption.LocalOption}",
                               LocalizableStrings.LocalOptionDescription,
                               Accept.NoArguments()),
                           Create.Option(
                               $"--{ToolAppliedOption.ToolPathOption}",
                               LocalizableStrings.ToolPathOptionDescription,
                               Accept.ExactlyOneArgument()
                               .With(name: LocalizableStrings.ToolPathOptionName)),
                           Create.Option(
                               "--version",
                               LocalizableStrings.VersionOptionDescription,
                               Accept.ExactlyOneArgument()
                               .With(name: LocalizableStrings.VersionOptionName)),
                           Create.Option(
                               "--configfile",
                               LocalizableStrings.ConfigFileOptionDescription,
                               Accept.ExactlyOneArgument()
                               .With(name: LocalizableStrings.ConfigFileOptionName)),
                           Create.Option(
                               $"--{ToolAppliedOption.ToolManifest}",
                               LocalizableStrings.ManifestPathOptionDescription,
                               Accept.ZeroOrOneArgument()
                               .With(name: LocalizableStrings.ManifestPathOptionName)),
                           Create.Option(
                               "--add-source",
                               LocalizableStrings.AddSourceOptionDescription,
                               Accept.OneOrMoreArguments()
                               .With(name: LocalizableStrings.AddSourceOptionName)),
                           Create.Option(
                               "--framework",
                               LocalizableStrings.FrameworkOptionDescription,
                               Accept.ExactlyOneArgument()
                               .With(name: LocalizableStrings.FrameworkOptionName)),
                           ToolCommandRestorePassThroughOptions.DisableParallelOption(),
                           ToolCommandRestorePassThroughOptions.IgnoreFailedSourcesOption(),
                           ToolCommandRestorePassThroughOptions.NoCacheOption(),
                           ToolCommandRestorePassThroughOptions.InteractiveRestoreOption(),
                           CommonOptions.HelpOption(),
                           CommonOptions.VerbosityOption()));
 }
예제 #14
0
 public static Command List() =>
 Create.Command("list",
                LocalizableStrings.NetListCommand,
                Accept.ZeroOrOneArgument()
                .With(name: CommonLocalizableStrings.CmdProjectFile,
                      description:
                      CommonLocalizableStrings.ArgumentsProjectDescription)
                .DefaultToCurrentDirectory(),
                CommonOptions.HelpOption(),
                Create.Command("reference",
                               Tools.List.ProjectToProjectReferences.LocalizableStrings.AppFullName,
                               Accept.ZeroOrOneArgument(),
                               CommonOptions.HelpOption()));
예제 #15
0
 public static Command Publish() =>
 CreateWithRestoreOptions.Command(
     "publish",
     LocalizableStrings.AppDescription,
     Accept.ZeroOrMoreArguments()
     .With(name: CommonLocalizableStrings.SolutionOrProjectArgumentName,
           description: CommonLocalizableStrings.SolutionOrProjectArgumentDescription),
     CommonOptions.HelpOption(),
     Create.Option(
         "-o|--output",
         LocalizableStrings.OutputOptionDescription,
         Accept.ExactlyOneArgument()
         .With(name: LocalizableStrings.OutputOption)
         .ForwardAsSingle(o => $"-property:PublishDir={CommandDirectoryContext.GetFullPath(o.Arguments.Single())}")),
     CommonOptions.FrameworkOption(LocalizableStrings.FrameworkOptionDescription),
     CommonOptions.RuntimeOption(LocalizableStrings.RuntimeOptionDescription),
     CommonOptions.ConfigurationOption(LocalizableStrings.ConfigurationOptionDescription),
     CommonOptions.VersionSuffixOption(),
     Create.Option(
         "--manifest",
         LocalizableStrings.ManifestOptionDescription,
         Accept.OneOrMoreArguments()
         .With(name: LocalizableStrings.ManifestOption)
         .ForwardAsSingle(o => $"-property:TargetManifestFiles={string.Join("%3B", o.Arguments.Select(CommandDirectoryContext.GetFullPath))}")),
     Create.Option(
         "--no-build",
         LocalizableStrings.NoBuildOptionDescription,
         Accept.NoArguments().ForwardAs("-property:NoBuild=true")),
     Create.Option(
         "--self-contained",
         LocalizableStrings.SelfContainedOptionDescription,
         Accept.ZeroOrOneArgument()
         .WithSuggestionsFrom("true", "false")
         .ForwardAsSingle(o =>
 {
     string value = o.Arguments.Any() ? o.Arguments.Single() : "true";
     return($"-property:SelfContained={value}");
 })),
     Create.Option(
         "--no-self-contained",
         LocalizableStrings.NoSelfContainedOptionDescription,
         Accept.NoArguments().ForwardAs("-property:SelfContained=false")),
     Create.Option(
         "--nologo",
         LocalizableStrings.CmdNoLogo,
         Accept.NoArguments()
         .ForwardAs("-nologo")),
     CommonOptions.InteractiveMsBuildForwardOption(),
     CommonOptions.NoRestoreOption(),
     CommonOptions.VerbosityOption());
예제 #16
0
 public ListCommand()
     : base(
         name: "list",
         help: LocalizableStrings.NetListCommand,
         options: new Option[]
 {
     CommonOptions.HelpOption(),
     ListPackageReferencesCommandParser.ListPackageReferences(),
     ListProjectToProjectReferencesCommandParser.ListProjectToProjectReferences(),
 },
         arguments: Accept.ZeroOrOneArgument()
         .With(
             name: CommonLocalizableStrings.SolutionOrProjectArgumentName,
             description: CommonLocalizableStrings.SolutionOrProjectArgumentDescription)
         .DefaultToCurrentDirectory())
 {
 }
        // Creates a command setup with the args for "new", plus args for the input template parameters.
        public static Command CreateNewCommandWithArgsForTemplate(string commandName, string templateName,
                                                                  IReadOnlyList <ITemplateParameter> parameterDefinitions,
                                                                  IDictionary <string, string> longNameOverrides,
                                                                  IDictionary <string, string> shortNameOverrides,
                                                                  out IReadOnlyDictionary <string, IReadOnlyList <string> > templateParamMap)
        {
            IList <Option>   paramOptionList       = new List <Option>();
            HashSet <string> initiallyTakenAliases = ArgsForBuiltInCommands;

            Dictionary <string, IReadOnlyList <string> > canonicalToVariantMap = new Dictionary <string, IReadOnlyList <string> >();
            AliasAssignmentCoordinator assignmentCoordinator = new AliasAssignmentCoordinator(parameterDefinitions, longNameOverrides, shortNameOverrides, initiallyTakenAliases);

            if (assignmentCoordinator.InvalidParams.Count > 0)
            {
                string unusableDisplayList = string.Join(", ", assignmentCoordinator.InvalidParams);
                throw new Exception($"Template is malformed. The following parameter names are invalid: {unusableDisplayList}");
            }

            foreach (ITemplateParameter parameter in parameterDefinitions.Where(x => x.Priority != TemplateParameterPriority.Implicit))
            {
                Option         option;
                IList <string> aliasesForParam = new List <string>();

                if (assignmentCoordinator.LongNameAssignments.TryGetValue(parameter.Name, out string longVersion))
                {
                    aliasesForParam.Add(longVersion);
                }

                if (assignmentCoordinator.ShortNameAssignments.TryGetValue(parameter.Name, out string shortVersion))
                {
                    aliasesForParam.Add(shortVersion);
                }

                if (parameter is IAllowDefaultIfOptionWithoutValue parameterWithNoValueDefault &&
                    !string.IsNullOrEmpty(parameterWithNoValueDefault.DefaultIfOptionWithoutValue))
                {
                    // This switch can be provided with or without a value.
                    // If the user doesn't specify a value, it gets the value of DefaultIfOptionWithoutValue
                    option = Create.Option(string.Join("|", aliasesForParam), parameter.Documentation,
                                           Accept.ZeroOrOneArgument());
                }
예제 #18
0
 public Cli.CommandLine.Command Migrate() =>
 Create.Command(
     "migrate",
     ".NET Migrate Command",
     Accept.ZeroOrOneArgument()
     .MaterializeAs(o =>
                    new MigrateCommand.MigrateCommand(
                        new CallStage0DotnetSlnToManipulateSolutionFile(),
                        new CallStage0DotnetNewToAddTemplate(),
                        o.ValueOrDefault <string>("--template-file"),
                        o.Arguments.FirstOrDefault(),
                        o.ValueOrDefault <string>("--sdk-package-version"),
                        o.ValueOrDefault <string>("--xproj-file"),
                        o.ValueOrDefault <string>("--report-file"),
                        o.ValueOrDefault <bool>("--skip-project-references"),
                        o.ValueOrDefault <bool>("--format-report-file-json"),
                        o.ValueOrDefault <bool>("--skip-backup"), (l) => _stdOut.Append(l)))
     .With(name: "",
           description: ""),
     Create.Option("-t|--template-file",
                   "",
                   Accept.ExactlyOneArgument()),
     Create.Option("-v|--sdk-package-version",
                   "",
                   Accept.ExactlyOneArgument()),
     Create.Option("-x|--xproj-file",
                   "",
                   Accept.ExactlyOneArgument()),
     Create.Option("-s|--skip-project-references",
                   ""),
     Create.Option("-r|--report-file",
                   "",
                   Accept.ExactlyOneArgument()),
     Create.Option("--format-report-file-json",
                   ""),
     Create.Option("--skip-backup",
                   ""));
예제 #19
0
        // Creates a command setup with the args for "new", plus args for the input template parameters.
        public static Command CreateNewCommandWithArgsForTemplate(string commandName, string templateName,
                                                                  IReadOnlyList <ITemplateParameter> parameterDefinitions,
                                                                  IDictionary <string, string> longNameOverrides,
                                                                  IDictionary <string, string> shortNameOverrides,
                                                                  out IReadOnlyDictionary <string, IReadOnlyList <string> > templateParamMap)
        {
            IList <Option> paramOptionList = new List <Option>();

            Option[]         allBuiltInArgs = ArrayExtensions.CombineArrays(NewCommandVisibleArgs, NewCommandHiddenArgs, NewCommandReservedArgs, DebuggingCommandArgs);
            HashSet <string> takenAliases   = VariantsForOptions(allBuiltInArgs);
            HashSet <string> invalidParams  = new HashSet <string>();
            Dictionary <string, IReadOnlyList <string> > canonicalToVariantMap = new Dictionary <string, IReadOnlyList <string> >();

            foreach (ITemplateParameter parameter in parameterDefinitions.Where(x => x.Priority != TemplateParameterPriority.Implicit))
            {
                string canonical = parameter.Name;
                longNameOverrides.TryGetValue(canonical, out string longOverride);
                shortNameOverrides.TryGetValue(canonical, out string shortOverride);

                if (CommandAliasAssigner.TryAssignAliasesForParameter((x) => takenAliases.Contains(x), canonical, longOverride, shortOverride, out IReadOnlyList <string> assignedAliases))
                {
                    Option option;

                    if (string.Equals(parameter.DataType, "choice", StringComparison.OrdinalIgnoreCase))
                    {
                        IList <string> choices = parameter.Choices.Keys.ToList();
                        option = Create.Option(string.Join("|", assignedAliases), parameter.Documentation,
                                               Accept.ExactlyOneArgument()
                                               //.WithSuggestionsFrom(parameter.Choices.Keys.ToArray())
                                               .With(defaultValue: () => parameter.DefaultValue));
                    }
                    else if (string.Equals(parameter.DataType, "bool", StringComparison.OrdinalIgnoreCase))
                    {
                        option = Create.Option(string.Join("|", assignedAliases), parameter.Documentation,
                                               Accept.ZeroOrOneArgument()
                                               .WithSuggestionsFrom(new[] { "true", "false" }));
                    }
                    else
                    {
                        option = Create.Option(string.Join("|", assignedAliases), parameter.Documentation,
                                               Accept.ExactlyOneArgument());
                    }

                    paramOptionList.Add(option);                                    // add the option
                    canonicalToVariantMap.Add(canonical, assignedAliases.ToList()); // map the template canonical name to its aliases.
                    takenAliases.UnionWith(assignedAliases);                        // add the aliases to the taken aliases
                }
                else
                {
                    invalidParams.Add(canonical);
                }
            }

            if (invalidParams.Count > 0)
            {
                string unusableDisplayList = string.Join(", ", invalidParams);
                throw new Exception($"Template is malformed. The following parameter names are invalid: {unusableDisplayList}");
            }

            templateParamMap = canonicalToVariantMap;
            return(GetNewCommandForTemplate(commandName, templateName, NewCommandVisibleArgs, NewCommandHiddenArgs, DebuggingCommandArgs, paramOptionList.ToArray()));
        }