File: Common\ImplicitRestoreOptions.cs
Web Access
Project: src\src\sdk\src\Cli\Microsoft.DotNet.Cli.Definitions\Microsoft.DotNet.Cli.Definitions.csproj (Microsoft.DotNet.Cli.Definitions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.ObjectModel;
using System.CommandLine;
using Microsoft.DotNet.Cli.CommandLine;

namespace Microsoft.DotNet.Cli.Commands.Restore;

internal sealed class ImplicitRestoreOptions
{
    public readonly Option<IEnumerable<string>> SourceOption;
    public readonly Option<string> PackagesOption;
    public readonly Option<bool> CurrentRuntimeOption;
    public readonly Option<bool> DisableParallelOption;
    public readonly Option<string> ConfigFileOption;
    public readonly Option<bool> NoCacheOption;
    public readonly Option<bool> NoHttpCacheOption;
    public readonly Option<bool> IgnoreFailedSourcesOption;
    public readonly Option<bool> ForceOption;
    public readonly Option<ReadOnlyDictionary<string, string>?> PropertiesOption;
    public readonly Option<ReadOnlyDictionary<string, string>?> RestorePropertiesOption;

    public ImplicitRestoreOptions(bool showHelp, bool useShortOptions)
    {
        SourceOption = CreateSourceOption(showHelp, useShortOptions);
        
        PackagesOption = new Option<string>("--packages")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdPackagesOptionDescription : string.Empty,
            HelpName = CommandDefinitionStrings.CmdPackagesOption,
            Hidden = !showHelp
        }.ForwardAsSingle(o => $"-property:RestorePackagesPath={CommandDirectoryContext.GetFullPath(o)}");

        CurrentRuntimeOption = CommonOptions.CreateUseCurrentRuntimeOption(CommandDefinitionStrings.CmdCurrentRuntimeOptionDescription);

        DisableParallelOption = new Option<bool>("--disable-parallel")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdDisableParallelOptionDescription : string.Empty,
            Hidden = !showHelp,
            Arity = ArgumentArity.Zero
        }.ForwardAs("-property:RestoreDisableParallel=true");

        ConfigFileOption = new Option<string>("--configfile")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdConfigFileOptionDescription : string.Empty,
            HelpName = CommandDefinitionStrings.CmdConfigFileOption,
            Hidden = !showHelp
        }.ForwardAsSingle(o => $"-property:RestoreConfigFile={CommandDirectoryContext.GetFullPath(o)}");

        NoCacheOption = new Option<bool>("--no-cache")
        {
            Description = string.Empty,
            Hidden = true,
            Arity = ArgumentArity.Zero
        }.ForwardAs("-property:RestoreNoCache=true");

        NoHttpCacheOption = new Option<bool>("--no-http-cache")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdNoHttpCacheOptionDescription : string.Empty,
            Hidden = !showHelp,
            Arity = ArgumentArity.Zero
        }.ForwardAs("-property:RestoreNoHttpCache=true");

        IgnoreFailedSourcesOption = new Option<bool>("--ignore-failed-sources")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdIgnoreFailedSourcesOptionDescription : string.Empty,
            Hidden = !showHelp,
            Arity = ArgumentArity.Zero
        }.ForwardAs("-property:RestoreIgnoreFailedSources=true");

        ForceOption = new Option<bool>("--force")
        {
            Description = CommandDefinitionStrings.CmdForceRestoreOptionDescription,
            Hidden = !showHelp,
            Arity = ArgumentArity.Zero
        }.ForwardAs("-property:RestoreForce=true");
        if (useShortOptions)
        {
            ForceOption.Aliases.Add("-f");
        }

        PropertiesOption = CommonOptions.CreatePropertyOption();
        RestorePropertiesOption = CommonOptions.CreateRestorePropertyOption();
    }

    private static Option<IEnumerable<string>> CreateSourceOption(bool showHelp, bool useShortOptions)
    {
        var option = new Option<IEnumerable<string>>("--source")
        {
            Description = showHelp ? CommandDefinitionStrings.CmdSourceOptionDescription : string.Empty,
            HelpName = CommandDefinitionStrings.CmdSourceOption,
            Hidden = !showHelp
        }.ForwardAsSingle(o => $"-property:RestoreSources={string.Join("%3B", o)}")
         .AllowSingleArgPerToken();

        if (useShortOptions)
        {
            option.Aliases.Add("-s");
        }

        return option;
    }

    public void AddTo(IList<Option> options)
    {
        options.Add(SourceOption);
        options.Add(PackagesOption);
        options.Add(CurrentRuntimeOption);
        options.Add(DisableParallelOption);
        options.Add(ConfigFileOption);
        options.Add(NoCacheOption);
        options.Add(NoHttpCacheOption);
        options.Add(IgnoreFailedSourcesOption);
        options.Add(ForceOption);
        options.Add(PropertiesOption);
        options.Add(RestorePropertiesOption);
    }
}