File: Commands\LocalsCommand.cs
Web Access
Project: src\nuget-client\src\NuGet.Core\NuGet.CommandLine.XPlat\NuGet.CommandLine.XPlat.csproj (NuGet.CommandLine.XPlat)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable enable

using System;
using System.CommandLine;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using NuGet.Commands;

namespace NuGet.CommandLine.XPlat
{
    internal static class LocalsCommand
    {
        internal static void Register(Command parent, Func<ILoggerWithColor> getLogger)
        {
            var localsCmd = new Command("locals", Strings.LocalsCommand_Description);

            var clearOption = new Option<bool>("--clear", "-c")
            {
                Arity = ArgumentArity.Zero,
                Description = Strings.LocalsCommand_ClearDescription,
            };

            var listOption = new Option<bool>("--list", "-l")
            {
                Arity = ArgumentArity.Zero,
                Description = Strings.LocalsCommand_ListDescription,
            };

            var cacheLocationArgument = new Argument<string>("Cache Location(s)")
            {
                Arity = ArgumentArity.ZeroOrOne,
                Description = Strings.LocalsCommand_ArgumentDescription,
            };

            localsCmd.Options.Add(clearOption);
            localsCmd.Options.Add(listOption);
            localsCmd.Arguments.Add(cacheLocationArgument);

            localsCmd.SetAction((parseResult, cancellationToken) =>
            {
                var logger = getLogger();
                var setting = XPlatUtility.GetSettingsForCurrentWorkingDirectory();

                string? cacheLocation = parseResult.GetValue(cacheLocationArgument);
                bool clear = parseResult.GetValue(clearOption);
                bool list = parseResult.GetValue(listOption);

                // Using both -clear and -list command options, or neither one of them, is not supported.
                // We use MinArgs = 0 even though the first argument is required,
                // to avoid throwing a command argument validation exception and
                // immediately show usage help for this command instead.
                if (string.IsNullOrWhiteSpace(cacheLocation))
                {
                    throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.LocalsCommand_NoArguments));
                }
                else if (clear && list)
                {
                    throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.LocalsCommand_MultipleOperations));
                }
                else if (!clear && !list)
                {
                    throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.LocalsCommand_NoOperation));
                }
                else
                {
                    var localsArgs = new LocalsArgs(new List<string> { cacheLocation },
                        setting,
                        logger.LogInformation,
                        logger.LogError,
                        clear,
                        list);

                    var localsCommandRunner = new LocalsCommandRunner();
                    localsCommandRunner.ExecuteCommand(localsArgs);
                }

                return Task.FromResult(0);
            });

            parent.Subcommands.Add(localsCmd);
        }
    }
}