File: Program.cs
Web Access
Project: src\src\Tools\dotnet-user-secrets\src\dotnet-user-secrets.csproj (dotnet-user-secrets)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.SecretManager.Tools.Internal;
using Microsoft.Extensions.Tools.Internal;
 
namespace Microsoft.Extensions.SecretManager.Tools;
 
public class Program
{
    private readonly IConsole _console;
    private readonly string _workingDirectory;
 
    public static int Main(string[] args)
    {
        DebugHelper.HandleDebugSwitch(ref args);
 
        int rc;
        new Program(PhysicalConsole.Singleton, Directory.GetCurrentDirectory()).TryRun(args, out rc);
        return rc;
    }
 
    public Program(IConsole console, string workingDirectory)
    {
        _console = console;
        _workingDirectory = workingDirectory;
    }
 
    // For testing.
    internal string SecretsFilePath { get; private set; }
 
    public bool TryRun(string[] args, out int returnCode)
    {
        try
        {
            returnCode = RunInternal(args);
            return true;
        }
        catch (Exception exception)
        {
            var reporter = CreateReporter(verbose: true);
            reporter.Verbose(exception.ToString());
            reporter.Error(Resources.FormatError_Command_Failed(exception.Message));
            returnCode = 1;
            return false;
        }
    }
 
    internal int RunInternal(params string[] args)
    {
        CommandLineOptions options;
        try
        {
            options = CommandLineOptions.Parse(args, _console);
        }
        catch (CommandParsingException ex)
        {
            CreateReporter(verbose: false).Error(ex.Message);
            return 1;
        }
 
        if (options == null)
        {
            return 1;
        }
 
        if (options.IsHelp)
        {
            return 2;
        }
 
        var reporter = CreateReporter(options.IsVerbose);
 
        if (options.Command is InitCommandFactory initCmd)
        {
            initCmd.Execute(new CommandContext(null, reporter, _console), _workingDirectory);
            return 0;
        }
 
        var userSecretsId = ResolveId(options, reporter);
 
        if (string.IsNullOrEmpty(userSecretsId))
        {
            return 1;
        }
 
        var store = new SecretsStore(userSecretsId, reporter);
        var context = new Internal.CommandContext(store, reporter, _console);
        options.Command.Execute(context);
 
        // For testing.
        SecretsFilePath = store.SecretsFilePath;
 
        return 0;
    }
 
    private IReporter CreateReporter(bool verbose)
        => new ConsoleReporter(_console, verbose, quiet: false);
 
    internal string ResolveId(CommandLineOptions options, IReporter reporter)
    {
        if (!string.IsNullOrEmpty(options.Id))
        {
            return options.Id;
        }
 
        var resolver = new ProjectIdResolver(reporter, _workingDirectory);
        return resolver.Resolve(options.Project, options.Configuration);
    }
}