Skip to content

Adding '--verbosity' global option best practices #1857

Open
@JobaDiniz

Description

@JobaDiniz

I'm trying to add a global option named --verbosity with -v alias following these set of designs, specially this one:

If you define aliases, use -v for --verbosity and make -v without an argument an alias for --verbosity Diagnostic.

Also, I'm using the Middleware to intercept the --verbosity and set the console log accordingly (not sure whether my code is the best way to accomplish this - but it's the only way I've found)

internal class MyRootCommand : RootCommand
    {
        public const string CommandName = "myroot";
        public static readonly Option<Verbosity> VerbosityOption = CreateVerbosityOption();

        private static Option<Verbosity> CreateVerbosityOption()
        {
            var verbosity = new Option<Verbosity>("--verbosity", ParseVerbosity, isDefault: true, description: "Specifies how much output is sent to the console.")
               .FromAmong(Verbosity.Quiet, Verbosity.Normal, Verbosity.Diagnostic);
            verbosity.AddAlias("-v");
            verbosity.AddValidator(ValidateVerbosity);
            return verbosity;
        }

        private static Verbosity ParseVerbosity(ArgumentResult result)
        {
            if (result.Tokens.Count == 1)
                return new Verbosity(result.Tokens[0].Value);

            if (result.Tokens.Count == 1 && result.Tokens[0].Value == "-v")
                return Verbosity.Diagnostic;

            return Verbosity.Normal;
        }

        private static void ValidateVerbosity(OptionResult result)
        {
            //not called
        }

        public MyRootCommand() : base("blablabla")
        {
            AddGlobalOption(VerbosityOption);

Intercepting and adding LoggerFactory to the binding context, using the verbosity global.

private static async Task Middleware(InvocationContext context, Func<InvocationContext, Task> next)
        {
            var verbosity = new Verbosity(context.ParseResult.GetValueForOption(MyRootCommand.VerbosityOption));
            var loggerFactory = LoggerFactory.Create(builder =>
            {
               //will use 'verbosity' to set the level here
                builder.AddConsole().SetMinimumLevel(LogLevel.Information);
            });
            context.BindingContext.AddService(s => loggerFactory);

Now, the ValidateVerbosity(...) is not called when I issue myroot -v to the command line. Error: Required argument missing for option: '-v'.

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions