mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-10-31 17:15:28 +08:00 
			
		
		
		
	Use file scoped namespace declarations
This commit is contained in:
		 Patrik Svensson
					Patrik Svensson
				
			
				
					committed by
					
						 Phil Scott
						Phil Scott
					
				
			
			
				
	
			
			
			 Phil Scott
						Phil Scott
					
				
			
						parent
						
							1dbaf50935
						
					
				
				
					commit
					ec1188b837
				
			| @@ -1,16 +1,15 @@ | ||||
| using System.ComponentModel; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public static partial class Program | ||||
| { | ||||
|     public static partial class Program | ||||
|     public sealed class BarSettings : CommandSettings | ||||
|     { | ||||
|         public sealed class BarSettings : CommandSettings | ||||
|         { | ||||
|             [CommandOption("--count")] | ||||
|             [Description("The number of bars to print")] | ||||
|             [DefaultValue(1)] | ||||
|             public int Count { get; set; } | ||||
|         } | ||||
|         [CommandOption("--count")] | ||||
|         [Description("The number of bars to print")] | ||||
|         [DefaultValue(1)] | ||||
|         public int Count { get; set; } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,38 +1,37 @@ | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public static partial class Program | ||||
| { | ||||
|     public static partial class Program | ||||
|     public static int Main(string[] args) | ||||
|     { | ||||
|         public static int Main(string[] args) | ||||
|         var app = new CommandApp(); | ||||
|         app.Configure(config => | ||||
|         { | ||||
|             var app = new CommandApp(); | ||||
|             app.Configure(config => | ||||
|             { | ||||
|                 config.AddDelegate("foo", Foo) | ||||
|                     .WithDescription("Foos the bars"); | ||||
|             config.AddDelegate("foo", Foo) | ||||
|                 .WithDescription("Foos the bars"); | ||||
|  | ||||
|                 config.AddDelegate<BarSettings>("bar", Bar) | ||||
|                     .WithDescription("Bars the foos"); ; | ||||
|             }); | ||||
|             config.AddDelegate<BarSettings>("bar", Bar) | ||||
|                 .WithDescription("Bars the foos"); ; | ||||
|         }); | ||||
|  | ||||
|             return app.Run(args); | ||||
|         return app.Run(args); | ||||
|     } | ||||
|  | ||||
|     private static int Foo(CommandContext context) | ||||
|     { | ||||
|         AnsiConsole.WriteLine("Foo"); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     private static int Bar(CommandContext context, BarSettings settings) | ||||
|     { | ||||
|         for (var index = 0; index < settings.Count; index++) | ||||
|         { | ||||
|             AnsiConsole.WriteLine("Bar"); | ||||
|         } | ||||
|  | ||||
|         private static int Foo(CommandContext context) | ||||
|         { | ||||
|             AnsiConsole.WriteLine("Foo"); | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         private static int Bar(CommandContext context, BarSettings settings) | ||||
|         { | ||||
|             for (var index = 0; index < settings.Count; index++) | ||||
|             { | ||||
|                 AnsiConsole.WriteLine("Bar"); | ||||
|             } | ||||
|  | ||||
|             return 0; | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,46 +2,45 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands | ||||
| namespace Demo.Commands; | ||||
|  | ||||
| [Description("Add a NuGet package reference to the project.")] | ||||
| public sealed class AddPackageCommand : Command<AddPackageCommand.Settings> | ||||
| { | ||||
|     [Description("Add a NuGet package reference to the project.")] | ||||
|     public sealed class AddPackageCommand : Command<AddPackageCommand.Settings> | ||||
|     public sealed class Settings : AddSettings | ||||
|     { | ||||
|         public sealed class Settings : AddSettings | ||||
|         { | ||||
|             [CommandArgument(0, "<PACKAGENAME>")] | ||||
|             [Description("The package reference to add.")] | ||||
|             public string PackageName { get; set; } | ||||
|         [CommandArgument(0, "<PACKAGENAME>")] | ||||
|         [Description("The package reference to add.")] | ||||
|         public string PackageName { get; set; } | ||||
|  | ||||
|             [CommandOption("-v|--version <VERSION>")] | ||||
|             [Description("The version of the package to add.")] | ||||
|             public string Version { get; set; } | ||||
|         [CommandOption("-v|--version <VERSION>")] | ||||
|         [Description("The version of the package to add.")] | ||||
|         public string Version { get; set; } | ||||
|  | ||||
|             [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|             [Description("Add the reference only when targeting a specific framework.")] | ||||
|             public string Framework { get; set; } | ||||
|         [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|         [Description("Add the reference only when targeting a specific framework.")] | ||||
|         public string Framework { get; set; } | ||||
|  | ||||
|             [CommandOption("--no-restore")] | ||||
|             [Description("Add the reference without performing restore preview and compatibility check.")] | ||||
|             public bool NoRestore { get; set; } | ||||
|         [CommandOption("--no-restore")] | ||||
|         [Description("Add the reference without performing restore preview and compatibility check.")] | ||||
|         public bool NoRestore { get; set; } | ||||
|  | ||||
|             [CommandOption("--source <SOURCE>")] | ||||
|             [Description("The NuGet package source to use during the restore.")] | ||||
|             public string Source { get; set; } | ||||
|         [CommandOption("--source <SOURCE>")] | ||||
|         [Description("The NuGet package source to use during the restore.")] | ||||
|         public string Source { get; set; } | ||||
|  | ||||
|             [CommandOption("--package-directory <PACKAGEDIR>")] | ||||
|             [Description("The directory to restore packages to.")] | ||||
|             public string PackageDirectory { get; set; } | ||||
|         [CommandOption("--package-directory <PACKAGEDIR>")] | ||||
|         [Description("The directory to restore packages to.")] | ||||
|         public string PackageDirectory { get; set; } | ||||
|  | ||||
|             [CommandOption("--interactive")] | ||||
|             [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|             public bool Interactive { get; set; } | ||||
|         } | ||||
|         [CommandOption("--interactive")] | ||||
|         [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|         public bool Interactive { get; set; } | ||||
|     } | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|         { | ||||
|             SettingsDumper.Dump(settings); | ||||
|             return 0; | ||||
|         } | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         SettingsDumper.Dump(settings); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,29 +2,28 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands | ||||
| namespace Demo.Commands; | ||||
|  | ||||
| public sealed class AddReferenceCommand : Command<AddReferenceCommand.Settings> | ||||
| { | ||||
|     public sealed class AddReferenceCommand : Command<AddReferenceCommand.Settings> | ||||
|     public sealed class Settings : AddSettings | ||||
|     { | ||||
|         public sealed class Settings : AddSettings | ||||
|         { | ||||
|             [CommandArgument(0, "<PROJECTPATH>")] | ||||
|             [Description("The package reference to add.")] | ||||
|             public string ProjectPath { get; set; } | ||||
|         [CommandArgument(0, "<PROJECTPATH>")] | ||||
|         [Description("The package reference to add.")] | ||||
|         public string ProjectPath { get; set; } | ||||
|  | ||||
|             [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|             [Description("Add the reference only when targeting a specific framework.")] | ||||
|             public string Framework { get; set; } | ||||
|         [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|         [Description("Add the reference only when targeting a specific framework.")] | ||||
|         public string Framework { get; set; } | ||||
|  | ||||
|             [CommandOption("--interactive")] | ||||
|             [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|             public bool Interactive { get; set; } | ||||
|         } | ||||
|         [CommandOption("--interactive")] | ||||
|         [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|         public bool Interactive { get; set; } | ||||
|     } | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|         { | ||||
|             SettingsDumper.Dump(settings); | ||||
|             return 0; | ||||
|         } | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         SettingsDumper.Dump(settings); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| using System.ComponentModel; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands | ||||
| namespace Demo.Commands; | ||||
|  | ||||
| public abstract class AddSettings : CommandSettings | ||||
| { | ||||
|     public abstract class AddSettings : CommandSettings | ||||
|     { | ||||
|         [CommandArgument(0, "<PROJECT>")] | ||||
|         [Description("The project file to operate on. If a file is not specified, the command will search the current directory for one.")] | ||||
|         public string Project { get; set; } | ||||
|     } | ||||
|     [CommandArgument(0, "<PROJECT>")] | ||||
|     [Description("The project file to operate on. If a file is not specified, the command will search the current directory for one.")] | ||||
|     public string Project { get; set; } | ||||
| } | ||||
|   | ||||
| @@ -2,69 +2,68 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands | ||||
| namespace Demo.Commands; | ||||
|  | ||||
| [Description("Build and run a .NET project output.")] | ||||
| public sealed class RunCommand : Command<RunCommand.Settings> | ||||
| { | ||||
|     [Description("Build and run a .NET project output.")] | ||||
|     public sealed class RunCommand : Command<RunCommand.Settings> | ||||
|     public sealed class Settings : CommandSettings | ||||
|     { | ||||
|         public sealed class Settings : CommandSettings | ||||
|         { | ||||
|             [CommandOption("-c|--configuration <CONFIGURATION>")] | ||||
|             [Description("The configuration to run for. The default for most projects is '[grey]Debug[/]'.")] | ||||
|             [DefaultValue("Debug")] | ||||
|             public string Configuration { get; set; } | ||||
|         [CommandOption("-c|--configuration <CONFIGURATION>")] | ||||
|         [Description("The configuration to run for. The default for most projects is '[grey]Debug[/]'.")] | ||||
|         [DefaultValue("Debug")] | ||||
|         public string Configuration { get; set; } | ||||
|  | ||||
|             [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|             [Description("The target framework to run for. The target framework must also be specified in the project file.")] | ||||
|             public string Framework { get; set; } | ||||
|         [CommandOption("-f|--framework <FRAMEWORK>")] | ||||
|         [Description("The target framework to run for. The target framework must also be specified in the project file.")] | ||||
|         public string Framework { get; set; } | ||||
|  | ||||
|             [CommandOption("-r|--runtime <RUNTIMEIDENTIFIER>")] | ||||
|             [Description("The target runtime to run for.")] | ||||
|             public string RuntimeIdentifier { get; set; } | ||||
|         [CommandOption("-r|--runtime <RUNTIMEIDENTIFIER>")] | ||||
|         [Description("The target runtime to run for.")] | ||||
|         public string RuntimeIdentifier { get; set; } | ||||
|  | ||||
|             [CommandOption("-p|--project <PROJECTPATH>")] | ||||
|             [Description("The path to the project file to run (defaults to the current directory if there is only one project).")] | ||||
|             public string ProjectPath { get; set; } | ||||
|         [CommandOption("-p|--project <PROJECTPATH>")] | ||||
|         [Description("The path to the project file to run (defaults to the current directory if there is only one project).")] | ||||
|         public string ProjectPath { get; set; } | ||||
|  | ||||
|             [CommandOption("--launch-profile <LAUNCHPROFILE>")] | ||||
|             [Description("The name of the launch profile (if any) to use when launching the application.")] | ||||
|             public string LaunchProfile { get; set; } | ||||
|         [CommandOption("--launch-profile <LAUNCHPROFILE>")] | ||||
|         [Description("The name of the launch profile (if any) to use when launching the application.")] | ||||
|         public string LaunchProfile { get; set; } | ||||
|  | ||||
|             [CommandOption("--no-launch-profile")] | ||||
|             [Description("Do not attempt to use [grey]launchSettings.json[/] to configure the application.")] | ||||
|             public bool NoLaunchProfile { get; set; } | ||||
|         [CommandOption("--no-launch-profile")] | ||||
|         [Description("Do not attempt to use [grey]launchSettings.json[/] to configure the application.")] | ||||
|         public bool NoLaunchProfile { get; set; } | ||||
|  | ||||
|             [CommandOption("--no-build")] | ||||
|             [Description("Do not build the project before running. Implies [grey]--no-restore[/].")] | ||||
|             public bool NoBuild { get; set; } | ||||
|         [CommandOption("--no-build")] | ||||
|         [Description("Do not build the project before running. Implies [grey]--no-restore[/].")] | ||||
|         public bool NoBuild { get; set; } | ||||
|  | ||||
|             [CommandOption("--interactive")] | ||||
|             [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|             public string Interactive { get; set; } | ||||
|         [CommandOption("--interactive")] | ||||
|         [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")] | ||||
|         public string Interactive { get; set; } | ||||
|  | ||||
|             [CommandOption("--no-restore")] | ||||
|             [Description("Do not restore the project before building.")] | ||||
|             public bool NoRestore { get; set; } | ||||
|         [CommandOption("--no-restore")] | ||||
|         [Description("Do not restore the project before building.")] | ||||
|         public bool NoRestore { get; set; } | ||||
|  | ||||
|             [CommandOption("--verbosity <VERBOSITY>")] | ||||
|             [Description("Set the MSBuild verbosity level. Allowed values are q[grey]uiet[/], m[grey]inimal[/], n[grey]ormal[/], d[grey]etailed[/], and diag[grey]nostic[/].")] | ||||
|             [TypeConverter(typeof(VerbosityConverter))] | ||||
|             [DefaultValue(Verbosity.Normal)] | ||||
|             public Verbosity Verbosity { get; set; } | ||||
|         [CommandOption("--verbosity <VERBOSITY>")] | ||||
|         [Description("Set the MSBuild verbosity level. Allowed values are q[grey]uiet[/], m[grey]inimal[/], n[grey]ormal[/], d[grey]etailed[/], and diag[grey]nostic[/].")] | ||||
|         [TypeConverter(typeof(VerbosityConverter))] | ||||
|         [DefaultValue(Verbosity.Normal)] | ||||
|         public Verbosity Verbosity { get; set; } | ||||
|  | ||||
|             [CommandOption("--no-dependencies")] | ||||
|             [Description("Do not restore project-to-project references and only restore the specified project.")] | ||||
|             public bool NoDependencies { get; set; } | ||||
|         [CommandOption("--no-dependencies")] | ||||
|         [Description("Do not restore project-to-project references and only restore the specified project.")] | ||||
|         public bool NoDependencies { get; set; } | ||||
|  | ||||
|             [CommandOption("--force")] | ||||
|             [Description("Force all dependencies to be resolved even if the last restore was successful. This is equivalent to deleting [grey]project.assets.json[/].")] | ||||
|             public bool Force { get; set; } | ||||
|         } | ||||
|         [CommandOption("--force")] | ||||
|         [Description("Force all dependencies to be resolved even if the last restore was successful. This is equivalent to deleting [grey]project.assets.json[/].")] | ||||
|         public bool Force { get; set; } | ||||
|     } | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|         { | ||||
|             SettingsDumper.Dump(settings); | ||||
|             return 0; | ||||
|         } | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         SettingsDumper.Dump(settings); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,39 +3,38 @@ using System.ComponentModel; | ||||
| using Demo.Utilities; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Commands | ||||
| namespace Demo.Commands; | ||||
|  | ||||
| [Description("Launches a web server in the current working directory and serves all files in it.")] | ||||
| public sealed class ServeCommand : Command<ServeCommand.Settings> | ||||
| { | ||||
|     [Description("Launches a web server in the current working directory and serves all files in it.")] | ||||
|     public sealed class ServeCommand : Command<ServeCommand.Settings> | ||||
|     public sealed class Settings : CommandSettings | ||||
|     { | ||||
|         public sealed class Settings : CommandSettings | ||||
|         { | ||||
|             [CommandOption("-p|--port <PORT>")] | ||||
|             [Description("Port to use. Defaults to [grey]8080[/]. Use [grey]0[/] for a dynamic port.")] | ||||
|             public int Port { get; set; } | ||||
|         [CommandOption("-p|--port <PORT>")] | ||||
|         [Description("Port to use. Defaults to [grey]8080[/]. Use [grey]0[/] for a dynamic port.")] | ||||
|         public int Port { get; set; } | ||||
|  | ||||
|             [CommandOption("-o|--open-browser [BROWSER]")] | ||||
|             [Description("Open a web browser when the server starts. You can also specify which browser to use. If none is specified, the default one will be used.")] | ||||
|             public FlagValue<string> OpenBrowser { get; set; } | ||||
|         } | ||||
|         [CommandOption("-o|--open-browser [BROWSER]")] | ||||
|         [Description("Open a web browser when the server starts. You can also specify which browser to use. If none is specified, the default one will be used.")] | ||||
|         public FlagValue<string> OpenBrowser { get; set; } | ||||
|     } | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         if (settings.OpenBrowser.IsSet) | ||||
|         { | ||||
|             if (settings.OpenBrowser.IsSet) | ||||
|             var browser = settings.OpenBrowser.Value; | ||||
|             if (browser != null) | ||||
|             { | ||||
|                 var browser = settings.OpenBrowser.Value; | ||||
|                 if (browser != null) | ||||
|                 { | ||||
|                     Console.WriteLine($"Open in {browser}"); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     Console.WriteLine($"Open in default browser."); | ||||
|                 } | ||||
|                 Console.WriteLine($"Open in {browser}"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Console.WriteLine($"Open in default browser."); | ||||
|             } | ||||
|  | ||||
|             SettingsDumper.Dump(settings); | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         SettingsDumper.Dump(settings); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,37 +1,36 @@ | ||||
| using Demo.Commands; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo | ||||
| namespace Demo; | ||||
|  | ||||
| public static class Program | ||||
| { | ||||
|     public static class Program | ||||
|     public static int Main(string[] args) | ||||
|     { | ||||
|         public static int Main(string[] args) | ||||
|         var app = new CommandApp(); | ||||
|         app.Configure(config => | ||||
|         { | ||||
|             var app = new CommandApp(); | ||||
|             app.Configure(config => | ||||
|             { | ||||
|                 config.SetApplicationName("fake-dotnet"); | ||||
|                 config.ValidateExamples(); | ||||
|                 config.AddExample(new[] { "run", "--no-build" }); | ||||
|             config.SetApplicationName("fake-dotnet"); | ||||
|             config.ValidateExamples(); | ||||
|             config.AddExample(new[] { "run", "--no-build" }); | ||||
|  | ||||
|                 // Run | ||||
|                 config.AddCommand<RunCommand>("run"); | ||||
|  | ||||
|                 // Add | ||||
|                 config.AddBranch<AddSettings>("add", add => | ||||
|                 { | ||||
|                     add.SetDescription("Add a package or reference to a .NET project"); | ||||
|                     add.AddCommand<AddPackageCommand>("package"); | ||||
|                     add.AddCommand<AddReferenceCommand>("reference"); | ||||
|                 }); | ||||
|             { | ||||
|                 add.SetDescription("Add a package or reference to a .NET project"); | ||||
|                 add.AddCommand<AddPackageCommand>("package"); | ||||
|                 add.AddCommand<AddReferenceCommand>("reference"); | ||||
|             }); | ||||
|  | ||||
|                 // Serve | ||||
|                 config.AddCommand<ServeCommand>("serve") | ||||
|                     .WithExample(new[] { "serve", "-o", "firefox" }) | ||||
|                     .WithExample(new[] { "serve", "--port", "80", "-o", "firefox" }); | ||||
|             }); | ||||
|                 .WithExample(new[] { "serve", "-o", "firefox" }) | ||||
|                 .WithExample(new[] { "serve", "--port", "80", "-o", "firefox" }); | ||||
|         }); | ||||
|  | ||||
|             return app.Run(args); | ||||
|         } | ||||
|         return app.Run(args); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,29 +1,28 @@ | ||||
| using Spectre.Console; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Demo.Utilities | ||||
| namespace Demo.Utilities; | ||||
|  | ||||
| public static class SettingsDumper | ||||
| { | ||||
|     public static class SettingsDumper | ||||
|     public static void Dump(CommandSettings settings) | ||||
|     { | ||||
|         public static void Dump(CommandSettings settings) | ||||
|         var table = new Table().RoundedBorder(); | ||||
|         table.AddColumn("[grey]Name[/]"); | ||||
|         table.AddColumn("[grey]Value[/]"); | ||||
|  | ||||
|         var properties = settings.GetType().GetProperties(); | ||||
|         foreach (var property in properties) | ||||
|         { | ||||
|             var table = new Table().RoundedBorder(); | ||||
|             table.AddColumn("[grey]Name[/]"); | ||||
|             table.AddColumn("[grey]Value[/]"); | ||||
|             var value = property.GetValue(settings) | ||||
|                 ?.ToString() | ||||
|                 ?.Replace("[", "[["); | ||||
|  | ||||
|             var properties = settings.GetType().GetProperties(); | ||||
|             foreach (var property in properties) | ||||
|             { | ||||
|                 var value = property.GetValue(settings) | ||||
|                     ?.ToString() | ||||
|                     ?.Replace("[", "[["); | ||||
|  | ||||
|                 table.AddRow( | ||||
|                     property.Name, | ||||
|                     value ?? "[grey]null[/]"); | ||||
|             } | ||||
|  | ||||
|             AnsiConsole.Write(table); | ||||
|             table.AddRow( | ||||
|                 property.Name, | ||||
|                 value ?? "[grey]null[/]"); | ||||
|         } | ||||
|  | ||||
|         AnsiConsole.Write(table); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,24 +3,24 @@ using System.Collections.Generic; | ||||
| using System.ComponentModel; | ||||
| using System.Globalization; | ||||
|  | ||||
| namespace Demo | ||||
| namespace Demo; | ||||
|  | ||||
| public enum Verbosity | ||||
| { | ||||
|     public enum Verbosity | ||||
|     { | ||||
|         Quiet, | ||||
|         Minimal, | ||||
|         Normal, | ||||
|         Detailed, | ||||
|         Diagnostic | ||||
|     } | ||||
|     Quiet, | ||||
|     Minimal, | ||||
|     Normal, | ||||
|     Detailed, | ||||
|     Diagnostic | ||||
| } | ||||
|  | ||||
|     public sealed class VerbosityConverter : TypeConverter | ||||
|     { | ||||
|         private readonly Dictionary<string, Verbosity> _lookup; | ||||
| public sealed class VerbosityConverter : TypeConverter | ||||
| { | ||||
|     private readonly Dictionary<string, Verbosity> _lookup; | ||||
|  | ||||
|         public VerbosityConverter() | ||||
|         { | ||||
|             _lookup = new Dictionary<string, Verbosity>(StringComparer.OrdinalIgnoreCase) | ||||
|     public VerbosityConverter() | ||||
|     { | ||||
|         _lookup = new Dictionary<string, Verbosity>(StringComparer.OrdinalIgnoreCase) | ||||
|             { | ||||
|                 { "q", Verbosity.Quiet }, | ||||
|                 { "quiet", Verbosity.Quiet }, | ||||
| @@ -33,22 +33,21 @@ namespace Demo | ||||
|                 { "diag", Verbosity.Diagnostic }, | ||||
|                 { "diagnostic", Verbosity.Diagnostic } | ||||
|             }; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) | ||||
|     public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) | ||||
|     { | ||||
|         if (value is string stringValue) | ||||
|         { | ||||
|             if (value is string stringValue) | ||||
|             var result = _lookup.TryGetValue(stringValue, out var verbosity); | ||||
|             if (!result) | ||||
|             { | ||||
|                 var result = _lookup.TryGetValue(stringValue, out var verbosity); | ||||
|                 if (!result) | ||||
|                 { | ||||
|                     const string format = "The value '{0}' is not a valid verbosity."; | ||||
|                     var message = string.Format(CultureInfo.InvariantCulture, format, value); | ||||
|                     throw new InvalidOperationException(message); | ||||
|                 } | ||||
|                 return verbosity; | ||||
|                 const string format = "The value '{0}' is not a valid verbosity."; | ||||
|                 var message = string.Format(CultureInfo.InvariantCulture, format, value); | ||||
|                 throw new InvalidOperationException(message); | ||||
|             } | ||||
|             throw new NotSupportedException("Can't convert value to verbosity."); | ||||
|             return verbosity; | ||||
|         } | ||||
|         throw new NotSupportedException("Can't convert value to verbosity."); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,20 +1,19 @@ | ||||
| using System; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| { | ||||
|     public sealed class MyCommand : Command | ||||
|     { | ||||
|         public override int Execute(CommandContext context) | ||||
|         { | ||||
|             if (!(context.Data is int data)) | ||||
|             { | ||||
|                 throw new InvalidOperationException("Command has no associated data."); | ||||
|                  | ||||
|             } | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class MyCommand : Command | ||||
| { | ||||
|     public override int Execute(CommandContext context) | ||||
|     { | ||||
|         if (!(context.Data is int data)) | ||||
|         { | ||||
|             throw new InvalidOperationException("Command has no associated data."); | ||||
|  | ||||
|             AnsiConsole.WriteLine("Value = {0}", data); | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         AnsiConsole.WriteLine("Value = {0}", data); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,24 +1,23 @@ | ||||
| using System.Linq; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| { | ||||
|     public static class Program | ||||
|     { | ||||
|         public static int Main(string[] args) | ||||
|         { | ||||
|             var app = new CommandApp(); | ||||
|             app.Configure(config => | ||||
|             { | ||||
|                 foreach(var index in Enumerable.Range(1, 10)) | ||||
|                 { | ||||
|                     config.AddCommand<MyCommand>($"c{index}") | ||||
|                         .WithDescription($"Prints the number {index}") | ||||
|                         .WithData(index); | ||||
|                 } | ||||
|             }); | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
|             return app.Run(args); | ||||
|         } | ||||
| public static class Program | ||||
| { | ||||
|     public static int Main(string[] args) | ||||
|     { | ||||
|         var app = new CommandApp(); | ||||
|         app.Configure(config => | ||||
|         { | ||||
|             foreach (var index in Enumerable.Range(1, 10)) | ||||
|             { | ||||
|                 config.AddCommand<MyCommand>($"c{index}") | ||||
|                     .WithDescription($"Prints the number {index}") | ||||
|                     .WithData(index); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         return app.Run(args); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,29 +2,28 @@ using System; | ||||
| using System.ComponentModel; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class DefaultCommand : Command<DefaultCommand.Settings> | ||||
| { | ||||
|     public sealed class DefaultCommand : Command<DefaultCommand.Settings> | ||||
|     private readonly IGreeter _greeter; | ||||
|  | ||||
|     public sealed class Settings : CommandSettings | ||||
|     { | ||||
|         private readonly IGreeter _greeter; | ||||
|         [CommandOption("-n|--name <NAME>")] | ||||
|         [Description("The person or thing to greet.")] | ||||
|         [DefaultValue("World")] | ||||
|         public string Name { get; set; } | ||||
|     } | ||||
|  | ||||
|         public sealed class Settings : CommandSettings | ||||
|         { | ||||
|             [CommandOption("-n|--name <NAME>")] | ||||
|             [Description("The person or thing to greet.")] | ||||
|             [DefaultValue("World")] | ||||
|             public string Name { get; set; } | ||||
|         } | ||||
|     public DefaultCommand(IGreeter greeter) | ||||
|     { | ||||
|         _greeter = greeter ?? throw new ArgumentNullException(nameof(greeter)); | ||||
|     } | ||||
|  | ||||
|         public DefaultCommand(IGreeter greeter) | ||||
|         { | ||||
|             _greeter = greeter ?? throw new ArgumentNullException(nameof(greeter)); | ||||
|         } | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|         { | ||||
|             _greeter.Greet(settings.Name); | ||||
|             return 0; | ||||
|         } | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         _greeter.Greet(settings.Name); | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,15 +1,14 @@ | ||||
| namespace Spectre.Console.Examples | ||||
| { | ||||
|     public interface IGreeter | ||||
|     { | ||||
|         void Greet(string name); | ||||
|     } | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
|     public sealed class HelloWorldGreeter : IGreeter | ||||
| public interface IGreeter | ||||
| { | ||||
|     void Greet(string name); | ||||
| } | ||||
|  | ||||
| public sealed class HelloWorldGreeter : IGreeter | ||||
| { | ||||
|     public void Greet(string name) | ||||
|     { | ||||
|         public void Greet(string name) | ||||
|         { | ||||
|             AnsiConsole.WriteLine($"Hello {name}!"); | ||||
|         } | ||||
|         AnsiConsole.WriteLine($"Hello {name}!"); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,40 +2,39 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class TypeRegistrar : ITypeRegistrar | ||||
| { | ||||
|     public sealed class TypeRegistrar : ITypeRegistrar | ||||
|     private readonly IServiceCollection _builder; | ||||
|  | ||||
|     public TypeRegistrar(IServiceCollection builder) | ||||
|     { | ||||
|         private readonly IServiceCollection _builder; | ||||
|         _builder = builder; | ||||
|     } | ||||
|  | ||||
|         public TypeRegistrar(IServiceCollection builder) | ||||
|     public ITypeResolver Build() | ||||
|     { | ||||
|         return new TypeResolver(_builder.BuildServiceProvider()); | ||||
|     } | ||||
|  | ||||
|     public void Register(Type service, Type implementation) | ||||
|     { | ||||
|         _builder.AddSingleton(service, implementation); | ||||
|     } | ||||
|  | ||||
|     public void RegisterInstance(Type service, object implementation) | ||||
|     { | ||||
|         _builder.AddSingleton(service, implementation); | ||||
|     } | ||||
|  | ||||
|     public void RegisterLazy(Type service, Func<object> func) | ||||
|     { | ||||
|         if (func is null) | ||||
|         { | ||||
|             _builder = builder; | ||||
|             throw new ArgumentNullException(nameof(func)); | ||||
|         } | ||||
|  | ||||
|         public ITypeResolver Build() | ||||
|         { | ||||
|             return new TypeResolver(_builder.BuildServiceProvider()); | ||||
|         } | ||||
|  | ||||
|         public void Register(Type service, Type implementation) | ||||
|         { | ||||
|             _builder.AddSingleton(service, implementation); | ||||
|         } | ||||
|  | ||||
|         public void RegisterInstance(Type service, object implementation) | ||||
|         { | ||||
|             _builder.AddSingleton(service, implementation); | ||||
|         } | ||||
|  | ||||
|         public void RegisterLazy(Type service, Func<object> func) | ||||
|         { | ||||
|             if (func is null) | ||||
|             { | ||||
|                 throw new ArgumentNullException(nameof(func)); | ||||
|             } | ||||
|  | ||||
|             _builder.AddSingleton(service, (provider) => func()); | ||||
|         } | ||||
|         _builder.AddSingleton(service, (provider) => func()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,33 +2,32 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class TypeResolver : ITypeResolver, IDisposable | ||||
| { | ||||
|     public sealed class TypeResolver : ITypeResolver, IDisposable | ||||
|     private readonly IServiceProvider _provider; | ||||
|  | ||||
|     public TypeResolver(IServiceProvider provider) | ||||
|     { | ||||
|         private readonly IServiceProvider _provider; | ||||
|         _provider = provider ?? throw new ArgumentNullException(nameof(provider)); | ||||
|     } | ||||
|  | ||||
|         public TypeResolver(IServiceProvider provider) | ||||
|     public object Resolve(Type type) | ||||
|     { | ||||
|         if (type == null) | ||||
|         { | ||||
|             _provider = provider ?? throw new ArgumentNullException(nameof(provider)); | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         public object Resolve(Type type) | ||||
|         { | ||||
|             if (type == null) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|         return _provider.GetService(type); | ||||
|     } | ||||
|  | ||||
|             return _provider.GetService(type); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|     public void Dispose() | ||||
|     { | ||||
|         if (_provider is IDisposable disposable) | ||||
|         { | ||||
|             if (_provider is IDisposable disposable) | ||||
|             { | ||||
|                 disposable.Dispose(); | ||||
|             } | ||||
|             disposable.Dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,21 @@ | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| { | ||||
|     public class Program | ||||
|     { | ||||
|         public static int Main(string[] args) | ||||
|         { | ||||
|             // Create a type registrar and register any dependencies. | ||||
|             // A type registrar is an adapter for a DI framework. | ||||
|             var registrations = new ServiceCollection(); | ||||
|             registrations.AddSingleton<IGreeter, HelloWorldGreeter>(); | ||||
|             var registrar = new TypeRegistrar(registrations); | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
|             // Create a new command app with the registrar | ||||
|             // and run it with the provided arguments. | ||||
|             var app = new CommandApp<DefaultCommand>(registrar); | ||||
|             return app.Run(args); | ||||
|         } | ||||
| public class Program | ||||
| { | ||||
|     public static int Main(string[] args) | ||||
|     { | ||||
|         // Create a type registrar and register any dependencies. | ||||
|         // A type registrar is an adapter for a DI framework. | ||||
|         var registrations = new ServiceCollection(); | ||||
|         registrations.AddSingleton<IGreeter, HelloWorldGreeter>(); | ||||
|         var registrar = new TypeRegistrar(registrations); | ||||
|  | ||||
|         // Create a new command app with the registrar | ||||
|         // and run it with the provided arguments. | ||||
|         var app = new CommandApp<DefaultCommand>(registrar); | ||||
|         return app.Run(args); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,34 +1,33 @@ | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public class HelloCommand : Command<HelloCommand.Settings> | ||||
| { | ||||
|     public class HelloCommand : Command<HelloCommand.Settings> | ||||
|     private ILogger<HelloCommand> _logger; | ||||
|     private IAnsiConsole _console; | ||||
|  | ||||
|     public HelloCommand(IAnsiConsole console, ILogger<HelloCommand> logger) | ||||
|     { | ||||
|         private ILogger<HelloCommand> _logger; | ||||
|         private IAnsiConsole _console; | ||||
|  | ||||
|         public HelloCommand(IAnsiConsole console, ILogger<HelloCommand> logger) | ||||
|         { | ||||
|             _console = console; | ||||
|             _logger = logger; | ||||
|             _logger.LogDebug("{0} initialized", nameof(HelloCommand)); | ||||
|         } | ||||
|  | ||||
|         public class Settings : LogCommandSettings | ||||
|         { | ||||
|             [CommandArgument(0, "[Name]")] | ||||
|             public string Name { get; set; } | ||||
|         } | ||||
|  | ||||
|  | ||||
|         public override int Execute(CommandContext context, Settings settings) | ||||
|         { | ||||
|             _logger.LogInformation("Starting my command"); | ||||
|             AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]"); | ||||
|             _logger.LogInformation("Completed my command"); | ||||
|  | ||||
|             return 0; | ||||
|         } | ||||
|         _console = console; | ||||
|         _logger = logger; | ||||
|         _logger.LogDebug("{0} initialized", nameof(HelloCommand)); | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public class Settings : LogCommandSettings | ||||
|     { | ||||
|         [CommandArgument(0, "[Name]")] | ||||
|         public string Name { get; set; } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public override int Execute(CommandContext context, Settings settings) | ||||
|     { | ||||
|         _logger.LogInformation("Starting my command"); | ||||
|         AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]"); | ||||
|         _logger.LogInformation("Completed my command"); | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,28 +5,28 @@ using System.Globalization; | ||||
| using Serilog.Events; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public class LogCommandSettings : CommandSettings | ||||
| { | ||||
|     public class LogCommandSettings : CommandSettings | ||||
|     [CommandOption("--logFile")] | ||||
|     [Description("Path and file name for logging")] | ||||
|     public string LogFile { get; set; } | ||||
|  | ||||
|     [CommandOption("--logLevel")] | ||||
|     [Description("Minimum level for logging")] | ||||
|     [TypeConverter(typeof(VerbosityConverter))] | ||||
|     [DefaultValue(LogEventLevel.Information)] | ||||
|     public LogEventLevel LogLevel { get; set; } | ||||
| } | ||||
|  | ||||
| public sealed class VerbosityConverter : TypeConverter | ||||
| { | ||||
|     private readonly Dictionary<string, LogEventLevel> _lookup; | ||||
|  | ||||
|     public VerbosityConverter() | ||||
|     { | ||||
|         [CommandOption("--logFile")] | ||||
|         [Description("Path and file name for logging")] | ||||
|         public string LogFile { get; set; } | ||||
|  | ||||
|         [CommandOption("--logLevel")] | ||||
|         [Description("Minimum level for logging")] | ||||
|         [TypeConverter(typeof(VerbosityConverter))] | ||||
|         [DefaultValue(LogEventLevel.Information)] | ||||
|         public LogEventLevel LogLevel { get; set; } | ||||
|     } | ||||
|  | ||||
|     public sealed class VerbosityConverter : TypeConverter | ||||
|     { | ||||
|         private readonly Dictionary<string, LogEventLevel> _lookup; | ||||
|  | ||||
|         public VerbosityConverter() | ||||
|         { | ||||
|             _lookup = new Dictionary<string, LogEventLevel>(StringComparer.OrdinalIgnoreCase) | ||||
|         _lookup = new Dictionary<string, LogEventLevel>(StringComparer.OrdinalIgnoreCase) | ||||
|             { | ||||
|                 {"d", LogEventLevel.Debug}, | ||||
|                 {"v", LogEventLevel.Verbose}, | ||||
| @@ -35,22 +35,21 @@ namespace Spectre.Console.Examples | ||||
|                 {"e", LogEventLevel.Error}, | ||||
|                 {"f", LogEventLevel.Fatal} | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) | ||||
|         { | ||||
|             if (value is string stringValue) | ||||
|             { | ||||
|                 var result = _lookup.TryGetValue(stringValue, out var verbosity); | ||||
|                 if (!result) | ||||
|                 { | ||||
|                     const string format = "The value '{0}' is not a valid verbosity."; | ||||
|                     var message = string.Format(CultureInfo.InvariantCulture, format, value); | ||||
|                     throw new InvalidOperationException(message); | ||||
|                 } | ||||
|                 return verbosity; | ||||
|             } | ||||
|             throw new NotSupportedException("Can't convert value to verbosity."); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) | ||||
|     { | ||||
|         if (value is string stringValue) | ||||
|         { | ||||
|             var result = _lookup.TryGetValue(stringValue, out var verbosity); | ||||
|             if (!result) | ||||
|             { | ||||
|                 const string format = "The value '{0}' is not a valid verbosity."; | ||||
|                 var message = string.Format(CultureInfo.InvariantCulture, format, value); | ||||
|                 throw new InvalidOperationException(message); | ||||
|             } | ||||
|             return verbosity; | ||||
|         } | ||||
|         throw new NotSupportedException("Can't convert value to verbosity."); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,19 +1,18 @@ | ||||
| using Serilog.Core; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| { | ||||
|     public class LogInterceptor : ICommandInterceptor | ||||
|     { | ||||
|         public static readonly LoggingLevelSwitch LogLevel = new(); | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
|         public void Intercept(CommandContext context, CommandSettings settings) | ||||
| public class LogInterceptor : ICommandInterceptor | ||||
| { | ||||
|     public static readonly LoggingLevelSwitch LogLevel = new(); | ||||
|  | ||||
|     public void Intercept(CommandContext context, CommandSettings settings) | ||||
|     { | ||||
|         if (settings is LogCommandSettings logSettings) | ||||
|         { | ||||
|             if (settings is LogCommandSettings logSettings) | ||||
|             { | ||||
|                 LoggingEnricher.Path = logSettings.LogFile ?? "application.log"; | ||||
|                 LogLevel.MinimumLevel = logSettings.LogLevel; | ||||
|             } | ||||
|             LoggingEnricher.Path = logSettings.LogFile ?? "application.log"; | ||||
|             LogLevel.MinimumLevel = logSettings.LogLevel; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -1,38 +1,37 @@ | ||||
| using Serilog.Core; | ||||
| using Serilog.Events; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| internal class LoggingEnricher : ILogEventEnricher | ||||
| { | ||||
|     internal class LoggingEnricher : ILogEventEnricher | ||||
|     private string _cachedLogFilePath; | ||||
|     private LogEventProperty _cachedLogFilePathProperty; | ||||
|  | ||||
|     // this path and level will be set by the LogInterceptor.cs after parsing the settings | ||||
|     public static string Path = string.Empty; | ||||
|  | ||||
|     public const string LogFilePathPropertyName = "LogFilePath"; | ||||
|  | ||||
|     public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) | ||||
|     { | ||||
|         private string _cachedLogFilePath; | ||||
|         private LogEventProperty _cachedLogFilePathProperty; | ||||
|         // the settings might not have a path or we might not be within a command in which case | ||||
|         // we won't have the setting so a default value for the log file will be required | ||||
|         LogEventProperty logFilePathProperty; | ||||
|  | ||||
|         // this path and level will be set by the LogInterceptor.cs after parsing the settings | ||||
|         public static string Path = string.Empty; | ||||
|  | ||||
|         public const string LogFilePathPropertyName = "LogFilePath"; | ||||
|  | ||||
|         public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) | ||||
|         if (_cachedLogFilePathProperty != null && Path.Equals(_cachedLogFilePath)) | ||||
|         { | ||||
|             // the settings might not have a path or we might not be within a command in which case | ||||
|             // we won't have the setting so a default value for the log file will be required | ||||
|             LogEventProperty logFilePathProperty; | ||||
|  | ||||
|             if (_cachedLogFilePathProperty != null && Path.Equals(_cachedLogFilePath)) | ||||
|             { | ||||
|                 // Path hasn't changed, so let's use the cached property | ||||
|                 logFilePathProperty = _cachedLogFilePathProperty; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // We've got a new path for the log. Let's create a new property | ||||
|                 // and cache it for future log events to use | ||||
|                 _cachedLogFilePath = Path; | ||||
|                 _cachedLogFilePathProperty = logFilePathProperty = propertyFactory.CreateProperty(LogFilePathPropertyName, Path); | ||||
|             } | ||||
|  | ||||
|             logEvent.AddPropertyIfAbsent(logFilePathProperty); | ||||
|             // Path hasn't changed, so let's use the cached property | ||||
|             logFilePathProperty = _cachedLogFilePathProperty; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // We've got a new path for the log. Let's create a new property | ||||
|             // and cache it for future log events to use | ||||
|             _cachedLogFilePath = Path; | ||||
|             _cachedLogFilePathProperty = logFilePathProperty = propertyFactory.CreateProperty(LogFilePathPropertyName, Path); | ||||
|         } | ||||
|  | ||||
|         logEvent.AddPropertyIfAbsent(logFilePathProperty); | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -2,40 +2,39 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class TypeRegistrar : ITypeRegistrar | ||||
| { | ||||
|     public sealed class TypeRegistrar : ITypeRegistrar | ||||
|     private readonly IServiceCollection _builder; | ||||
|  | ||||
|     public TypeRegistrar(IServiceCollection builder) | ||||
|     { | ||||
|         private readonly IServiceCollection _builder; | ||||
|  | ||||
|         public TypeRegistrar(IServiceCollection builder) | ||||
|         { | ||||
|             _builder = builder; | ||||
|         } | ||||
|  | ||||
|         public ITypeResolver Build() | ||||
|         { | ||||
|             return new TypeResolver(_builder.BuildServiceProvider()); | ||||
|         } | ||||
|  | ||||
|         public void Register(Type service, Type implementation) | ||||
|         { | ||||
|             _builder.AddSingleton(service, implementation); | ||||
|         } | ||||
|  | ||||
|         public void RegisterInstance(Type service, object implementation) | ||||
|         { | ||||
|             _builder.AddSingleton(service, implementation); | ||||
|         } | ||||
|  | ||||
|         public void RegisterLazy(Type service, Func<object> func) | ||||
|         { | ||||
|             if (func is null) | ||||
|             { | ||||
|                 throw new ArgumentNullException(nameof(func)); | ||||
|             } | ||||
|  | ||||
|             _builder.AddSingleton(service, _ => func()); | ||||
|         } | ||||
|         _builder = builder; | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public ITypeResolver Build() | ||||
|     { | ||||
|         return new TypeResolver(_builder.BuildServiceProvider()); | ||||
|     } | ||||
|  | ||||
|     public void Register(Type service, Type implementation) | ||||
|     { | ||||
|         _builder.AddSingleton(service, implementation); | ||||
|     } | ||||
|  | ||||
|     public void RegisterInstance(Type service, object implementation) | ||||
|     { | ||||
|         _builder.AddSingleton(service, implementation); | ||||
|     } | ||||
|  | ||||
|     public void RegisterLazy(Type service, Func<object> func) | ||||
|     { | ||||
|         if (func is null) | ||||
|         { | ||||
|             throw new ArgumentNullException(nameof(func)); | ||||
|         } | ||||
|  | ||||
|         _builder.AddSingleton(service, _ => func()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,20 +2,19 @@ using System; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Spectre.Console.Cli; | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public sealed class TypeResolver : ITypeResolver | ||||
| { | ||||
|     public sealed class TypeResolver : ITypeResolver | ||||
|     private readonly IServiceProvider _provider; | ||||
|  | ||||
|     public TypeResolver(IServiceProvider provider) | ||||
|     { | ||||
|         private readonly IServiceProvider _provider; | ||||
|  | ||||
|         public TypeResolver(IServiceProvider provider) | ||||
|         { | ||||
|             _provider = provider ?? throw new ArgumentNullException(nameof(provider)); | ||||
|         } | ||||
|  | ||||
|         public object Resolve(Type type) | ||||
|         { | ||||
|             return _provider.GetRequiredService(type); | ||||
|         } | ||||
|         _provider = provider ?? throw new ArgumentNullException(nameof(provider)); | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public object Resolve(Type type) | ||||
|     { | ||||
|         return _provider.GetRequiredService(type); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -12,42 +12,41 @@ using Spectre.Console.Cli; | ||||
|  * Spectre.Console CommandInterceptor | ||||
|  */ | ||||
|  | ||||
| namespace Spectre.Console.Examples | ||||
| namespace Spectre.Console.Examples; | ||||
|  | ||||
| public class Program | ||||
| { | ||||
|     public class Program | ||||
|     static int Main(string[] args) | ||||
|     { | ||||
|         static int Main(string[] args) | ||||
|         // to retrieve the log file name, we must first parse the command settings | ||||
|         // this will require us to delay setting the file path for the file writer. | ||||
|         // With serilog we can use an enricher and Serilog.Sinks.Map to dynamically | ||||
|         // pull this setting. | ||||
|         var serviceCollection = new ServiceCollection() | ||||
|             .AddLogging(configure => | ||||
|                 configure.AddSerilog(new LoggerConfiguration() | ||||
|                     // log level will be dynamically be controlled by our log interceptor upon running | ||||
|                     .MinimumLevel.ControlledBy(LogInterceptor.LogLevel) | ||||
|                     // the log enricher will add a new property with the log file path from the settings | ||||
|                     // that we can use to set the path dynamically | ||||
|                     .Enrich.With<LoggingEnricher>() | ||||
|                     // serilog.sinks.map will defer the configuration of the sink to be ondemand | ||||
|                     // allowing us to look at the properties set by the enricher to set the path appropriately | ||||
|                     .WriteTo.Map(LoggingEnricher.LogFilePathPropertyName, | ||||
|                         (logFilePath, wt) => wt.File($"{logFilePath}"), 1) | ||||
|                     .CreateLogger() | ||||
|                 ) | ||||
|             ); | ||||
|  | ||||
|         var registrar = new TypeRegistrar(serviceCollection); | ||||
|         var app = new CommandApp(registrar); | ||||
|  | ||||
|         app.Configure(config => | ||||
|         { | ||||
|             // to retrieve the log file name, we must first parse the command settings | ||||
|             // this will require us to delay setting the file path for the file writer. | ||||
|             // With serilog we can use an enricher and Serilog.Sinks.Map to dynamically | ||||
|             // pull this setting. | ||||
|             var serviceCollection = new ServiceCollection() | ||||
|                 .AddLogging(configure => | ||||
|                     configure.AddSerilog(new LoggerConfiguration() | ||||
|                         // log level will be dynamically be controlled by our log interceptor upon running | ||||
|                         .MinimumLevel.ControlledBy(LogInterceptor.LogLevel) | ||||
|                         // the log enricher will add a new property with the log file path from the settings | ||||
|                         // that we can use to set the path dynamically | ||||
|                         .Enrich.With<LoggingEnricher>() | ||||
|                         // serilog.sinks.map will defer the configuration of the sink to be ondemand | ||||
|                         // allowing us to look at the properties set by the enricher to set the path appropriately | ||||
|                         .WriteTo.Map(LoggingEnricher.LogFilePathPropertyName, | ||||
|                             (logFilePath, wt) => wt.File($"{logFilePath}"), 1) | ||||
|                         .CreateLogger() | ||||
|                     ) | ||||
|                 ); | ||||
|  | ||||
|             var registrar = new TypeRegistrar(serviceCollection); | ||||
|             var app = new CommandApp(registrar); | ||||
|  | ||||
|             app.Configure(config => | ||||
|             { | ||||
|                 config.SetInterceptor(new LogInterceptor()); // add the interceptor | ||||
|             config.SetInterceptor(new LogInterceptor()); // add the interceptor | ||||
|                 config.AddCommand<HelloCommand>("hello"); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|             return app.Run(args); | ||||
|         } | ||||
|         return app.Run(args); | ||||
|     } | ||||
| } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user