Skip to content

Instantly share code, notes, and snippets.

@fredrikhr
Last active March 19, 2024 08:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fredrikhr/c9509ff5ce2071880f987d770097c843 to your computer and use it in GitHub Desktop.
Save fredrikhr/c9509ff5ce2071880f987d770097c843 to your computer and use it in GitHub Desktop.
Using BindCommandLine for options in dotnet/command-line-api
using System;
using System.CommandLine;
using System.CommandLine.Binding;
using System.CommandLine.Builder;
using System.CommandLine.Hosting;
using System.CommandLine.Invocation;
using System.CommandLine.IO;
using System.CommandLine.Parsing;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
namespace DotnetCommandLineApiBindCommandLine
{
public static class Program
{
public static Task<int> Main(string[] args)
{
var app = new RootCommand { Handler = Handler };
var settingOption = new Option<string>("--setting");
app.AddOption(settingOption);
var optionsBinder = new ModelBinder<MyOptions>
{ EnforceExplicitBinding = true };
optionsBinder.BindMemberFromValue(o => o.MySetting, settingOption);
var parser = new CommandLineBuilder(app)
.UseDefaults()
.UseHost(Host.CreateDefaultBuilder, host =>
{
host.ConfigureServices(services =>
{
services.AddSingleton(optionsBinder);
services.AddOptions<MyOptions>()
.BindCommandLine();
});
})
.Build();
return parser.InvokeAsync(args ?? Array.Empty<string>());
}
internal static ICommandHandler Handler { get; } = CommandHandler.Create(
(IConsole console, IHost host, CancellationToken cancelToken) =>
{
var options = host.Services.GetRequiredService<IOptions<MyOptions>>()
.Value;
console.Out.WriteLine(options.MySetting);
});
}
public class MyOptions
{
public string MySetting { get; set; }
}
}
@fredrikhr
Copy link
Author

fredrikhr commented Mar 18, 2024 via email

@millokeller
Copy link

millokeller commented Mar 19, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment