From aee63cb9f2f6aeb20cb349e60ac3b18bfd5bf9e7 Mon Sep 17 00:00:00 2001
From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com>
Date: Tue, 23 Jan 2024 23:57:33 +0200
Subject: [PATCH] Add `Write(...)`, ```WriteLine(...)`, `Read()` and
`ReadLine()` extension methods for `IConsole` (#140)
---
...stemConsoleShouldBeAvoidedAnalyzerSpecs.cs | 2 +-
CliFx.Demo/Commands/BookAddCommand.cs | 53 ++++++++-----------
CliFx.Demo/Commands/BookCommand.cs | 4 +-
CliFx.Demo/Commands/BookListCommand.cs | 4 +-
CliFx.Demo/Commands/BookRemoveCommand.cs | 4 +-
CliFx.Demo/Utils/ConsoleExtensions.cs | 3 ++
.../Commands/CancellationTestCommand.cs | 6 +--
.../Commands/EnvironmentTestCommand.cs | 3 +-
CliFx.Tests/CancellationSpecs.cs | 6 +--
CliFx.Tests/ConsoleSpecs.cs | 6 +--
CliFx.Tests/ConversionSpecs.cs | 44 +++++++--------
CliFx.Tests/EnvironmentSpecs.cs | 8 +--
CliFx.Tests/OptionBindingSpecs.cs | 38 ++++++-------
CliFx.Tests/ParameterBindingSpecs.cs | 14 ++---
CliFx.Tests/RoutingSpecs.cs | 18 +++----
CliFx.Tests/TypeActivationSpecs.cs | 8 +--
CliFx/Attributes/CommandOptionAttribute.cs | 2 +-
CliFx/CliApplication.cs | 14 ++---
.../CommandInputConsoleFormatter.cs | 3 ++
CliFx/Formatting/ExceptionConsoleFormatter.cs | 3 ++
CliFx/Formatting/HelpConsoleFormatter.cs | 3 ++
CliFx/Infrastructure/IConsole.cs | 37 +++++++++++++
22 files changed, 161 insertions(+), 122 deletions(-)
diff --git a/CliFx.Analyzers.Tests/SystemConsoleShouldBeAvoidedAnalyzerSpecs.cs b/CliFx.Analyzers.Tests/SystemConsoleShouldBeAvoidedAnalyzerSpecs.cs
index 8992c8e..6216cc4 100644
--- a/CliFx.Analyzers.Tests/SystemConsoleShouldBeAvoidedAnalyzerSpecs.cs
+++ b/CliFx.Analyzers.Tests/SystemConsoleShouldBeAvoidedAnalyzerSpecs.cs
@@ -83,7 +83,7 @@ public class SystemConsoleShouldBeAvoidedAnalyzerSpecs
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Hello world");
+ console.WriteLine("Hello world");
return default;
}
}
diff --git a/CliFx.Demo/Commands/BookAddCommand.cs b/CliFx.Demo/Commands/BookAddCommand.cs
index ba863ab..12e47e5 100644
--- a/CliFx.Demo/Commands/BookAddCommand.cs
+++ b/CliFx.Demo/Commands/BookAddCommand.cs
@@ -9,7 +9,7 @@ using CliFx.Infrastructure;
namespace CliFx.Demo.Commands;
[Command("book add", Description = "Adds a book to the library.")]
-public partial class BookAddCommand(LibraryProvider libraryProvider) : ICommand
+public class BookAddCommand(LibraryProvider libraryProvider) : ICommand
{
[CommandParameter(0, Name = "title", Description = "Book title.")]
public required string Title { get; init; }
@@ -18,47 +18,38 @@ public partial class BookAddCommand(LibraryProvider libraryProvider) : ICommand
public required string Author { get; init; }
[CommandOption("published", 'p', Description = "Book publish date.")]
- public DateTimeOffset Published { get; init; } = CreateRandomDate();
+ public DateTimeOffset Published { get; init; } =
+ new(
+ Random.Shared.Next(1800, 2020),
+ Random.Shared.Next(1, 12),
+ Random.Shared.Next(1, 28),
+ Random.Shared.Next(1, 23),
+ Random.Shared.Next(1, 59),
+ Random.Shared.Next(1, 59),
+ TimeSpan.Zero
+ );
[CommandOption("isbn", 'n', Description = "Book ISBN.")]
- public Isbn Isbn { get; init; } = CreateRandomIsbn();
+ public Isbn Isbn { get; init; } =
+ new(
+ Random.Shared.Next(0, 999),
+ Random.Shared.Next(0, 99),
+ Random.Shared.Next(0, 99999),
+ Random.Shared.Next(0, 99),
+ Random.Shared.Next(0, 9)
+ );
public ValueTask ExecuteAsync(IConsole console)
{
if (libraryProvider.TryGetBook(Title) is not null)
- throw new CommandException("Book already exists.", 10);
+ throw new CommandException($"Book '{Title}' already exists.", 10);
var book = new Book(Title, Author, Published, Isbn);
libraryProvider.AddBook(book);
- console.Output.WriteLine("Book added.");
- console.Output.WriteBook(book);
+ console.WriteLine($"Book '{Title}' added.");
+ console.WriteBook(book);
return default;
}
}
-
-public partial class BookAddCommand
-{
- private static readonly Random Random = new();
-
- private static DateTimeOffset CreateRandomDate() =>
- new(
- Random.Next(1800, 2020),
- Random.Next(1, 12),
- Random.Next(1, 28),
- Random.Next(1, 23),
- Random.Next(1, 59),
- Random.Next(1, 59),
- TimeSpan.Zero
- );
-
- private static Isbn CreateRandomIsbn() =>
- new(
- Random.Next(0, 999),
- Random.Next(0, 99),
- Random.Next(0, 99999),
- Random.Next(0, 99),
- Random.Next(0, 9)
- );
-}
diff --git a/CliFx.Demo/Commands/BookCommand.cs b/CliFx.Demo/Commands/BookCommand.cs
index 93690d1..1e9658c 100644
--- a/CliFx.Demo/Commands/BookCommand.cs
+++ b/CliFx.Demo/Commands/BookCommand.cs
@@ -18,9 +18,9 @@ public class BookCommand(LibraryProvider libraryProvider) : ICommand
var book = libraryProvider.TryGetBook(Title);
if (book is null)
- throw new CommandException("Book not found.", 10);
+ throw new CommandException($"Book '{Title}' not found.", 10);
- console.Output.WriteBook(book);
+ console.WriteBook(book);
return default;
}
diff --git a/CliFx.Demo/Commands/BookListCommand.cs b/CliFx.Demo/Commands/BookListCommand.cs
index 2dd5648..7f8b92f 100644
--- a/CliFx.Demo/Commands/BookListCommand.cs
+++ b/CliFx.Demo/Commands/BookListCommand.cs
@@ -17,11 +17,11 @@ public class BookListCommand(LibraryProvider libraryProvider) : ICommand
{
// Add margin
if (i != 0)
- console.Output.WriteLine();
+ console.WriteLine();
// Render book
var book = library.Books[i];
- console.Output.WriteBook(book);
+ console.WriteBook(book);
}
return default;
diff --git a/CliFx.Demo/Commands/BookRemoveCommand.cs b/CliFx.Demo/Commands/BookRemoveCommand.cs
index 487c92a..4334a40 100644
--- a/CliFx.Demo/Commands/BookRemoveCommand.cs
+++ b/CliFx.Demo/Commands/BookRemoveCommand.cs
@@ -17,11 +17,11 @@ public class BookRemoveCommand(LibraryProvider libraryProvider) : ICommand
var book = libraryProvider.TryGetBook(Title);
if (book is null)
- throw new CommandException("Book not found.", 10);
+ throw new CommandException($"Book '{Title}' not found.", 10);
libraryProvider.RemoveBook(book);
- console.Output.WriteLine($"Book {Title} removed.");
+ console.WriteLine($"Book '{Title}' removed.");
return default;
}
diff --git a/CliFx.Demo/Utils/ConsoleExtensions.cs b/CliFx.Demo/Utils/ConsoleExtensions.cs
index a0605ba..92dc7c1 100644
--- a/CliFx.Demo/Utils/ConsoleExtensions.cs
+++ b/CliFx.Demo/Utils/ConsoleExtensions.cs
@@ -33,4 +33,7 @@ internal static class ConsoleExtensions
using (writer.Console.WithForegroundColor(ConsoleColor.White))
writer.WriteLine(book.Isbn);
}
+
+ public static void WriteBook(this IConsole console, Book book) =>
+ console.Output.WriteBook(book);
}
diff --git a/CliFx.Tests.Dummy/Commands/CancellationTestCommand.cs b/CliFx.Tests.Dummy/Commands/CancellationTestCommand.cs
index b2c568c..1858770 100644
--- a/CliFx.Tests.Dummy/Commands/CancellationTestCommand.cs
+++ b/CliFx.Tests.Dummy/Commands/CancellationTestCommand.cs
@@ -12,15 +12,15 @@ public class CancellationTestCommand : ICommand
{
try
{
- console.Output.WriteLine("Started.");
+ console.WriteLine("Started.");
await Task.Delay(TimeSpan.FromSeconds(3), console.RegisterCancellationHandler());
- console.Output.WriteLine("Completed.");
+ console.WriteLine("Completed.");
}
catch (OperationCanceledException)
{
- console.Output.WriteLine("Cancelled.");
+ console.WriteLine("Cancelled.");
throw;
}
}
diff --git a/CliFx.Tests.Dummy/Commands/EnvironmentTestCommand.cs b/CliFx.Tests.Dummy/Commands/EnvironmentTestCommand.cs
index 1ec64f8..ae65ef0 100644
--- a/CliFx.Tests.Dummy/Commands/EnvironmentTestCommand.cs
+++ b/CliFx.Tests.Dummy/Commands/EnvironmentTestCommand.cs
@@ -12,8 +12,7 @@ public class EnvironmentTestCommand : ICommand
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine($"Hello {GreetingTarget}!");
-
+ console.WriteLine($"Hello {GreetingTarget}!");
return default;
}
}
diff --git a/CliFx.Tests/CancellationSpecs.cs b/CliFx.Tests/CancellationSpecs.cs
index 3550745..aa6a6b5 100644
--- a/CliFx.Tests/CancellationSpecs.cs
+++ b/CliFx.Tests/CancellationSpecs.cs
@@ -66,18 +66,18 @@ public class CancellationSpecs(ITestOutputHelper testOutput) : SpecsBase(testOut
{
try
{
- console.Output.WriteLine("Started.");
+ console.WriteLine("Started.");
await Task.Delay(
TimeSpan.FromSeconds(3),
console.RegisterCancellationHandler()
);
- console.Output.WriteLine("Completed.");
+ console.WriteLine("Completed.");
}
catch (OperationCanceledException)
{
- console.Output.WriteLine("Cancelled.");
+ console.WriteLine("Cancelled.");
throw;
}
}
diff --git a/CliFx.Tests/ConsoleSpecs.cs b/CliFx.Tests/ConsoleSpecs.cs
index 2a95007..852de83 100644
--- a/CliFx.Tests/ConsoleSpecs.cs
+++ b/CliFx.Tests/ConsoleSpecs.cs
@@ -170,9 +170,9 @@ public class ConsoleSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(console.ReadKey().Key);
- console.Output.WriteLine(console.ReadKey().Key);
- console.Output.WriteLine(console.ReadKey().Key);
+ console.WriteLine(console.ReadKey().Key);
+ console.WriteLine(console.ReadKey().Key);
+ console.WriteLine(console.ReadKey().Key);
return default;
}
diff --git a/CliFx.Tests/ConversionSpecs.cs b/CliFx.Tests/ConversionSpecs.cs
index 5d9bda8..52f2a63 100644
--- a/CliFx.Tests/ConversionSpecs.cs
+++ b/CliFx.Tests/ConversionSpecs.cs
@@ -25,7 +25,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -62,7 +62,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -105,9 +105,9 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
- console.Output.WriteLine("Baz = " + Baz);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
+ console.WriteLine("Baz = " + Baz);
return default;
}
@@ -148,7 +148,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -185,7 +185,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo.ToString(CultureInfo.InvariantCulture));
+ console.WriteLine(Foo.ToString(CultureInfo.InvariantCulture));
return default;
}
}
@@ -225,7 +225,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo.ToString("u", CultureInfo.InvariantCulture));
+ console.WriteLine(Foo.ToString("u", CultureInfo.InvariantCulture));
return default;
}
}
@@ -265,7 +265,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo.ToString(null, CultureInfo.InvariantCulture));
+ console.WriteLine(Foo.ToString(null, CultureInfo.InvariantCulture));
return default;
}
}
@@ -307,7 +307,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine((int) Foo);
+ console.WriteLine((int) Foo);
return default;
}
}
@@ -347,8 +347,8 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -391,8 +391,8 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + (int?) Foo);
- console.Output.WriteLine("Bar = " + (int?) Bar);
+ console.WriteLine("Foo = " + (int?) Foo);
+ console.WriteLine("Bar = " + (int?) Bar);
return default;
}
@@ -437,7 +437,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo.Value);
+ console.WriteLine(Foo.Value);
return default;
}
}
@@ -497,8 +497,8 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo.Value);
- console.Output.WriteLine("Bar = " + Bar.Value);
+ console.WriteLine("Foo = " + Foo.Value);
+ console.WriteLine("Bar = " + Bar.Value);
return default;
}
@@ -545,7 +545,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -586,7 +586,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -628,7 +628,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -670,7 +670,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -712,7 +712,7 @@ public class ConversionSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutpu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
diff --git a/CliFx.Tests/EnvironmentSpecs.cs b/CliFx.Tests/EnvironmentSpecs.cs
index aa233a4..a419c7d 100644
--- a/CliFx.Tests/EnvironmentSpecs.cs
+++ b/CliFx.Tests/EnvironmentSpecs.cs
@@ -32,8 +32,8 @@ public class EnvironmentSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutp
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
- console.Output.WriteLine(Bar);
+ console.WriteLine(Foo);
+ console.WriteLine(Bar);
return default;
}
@@ -75,7 +75,7 @@ public class EnvironmentSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutp
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -116,7 +116,7 @@ public class EnvironmentSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutp
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
diff --git a/CliFx.Tests/OptionBindingSpecs.cs b/CliFx.Tests/OptionBindingSpecs.cs
index b635803..4e7dbb6 100644
--- a/CliFx.Tests/OptionBindingSpecs.cs
+++ b/CliFx.Tests/OptionBindingSpecs.cs
@@ -26,7 +26,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -63,7 +63,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
@@ -103,8 +103,8 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -148,8 +148,8 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -193,8 +193,8 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -236,7 +236,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -278,7 +278,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -320,7 +320,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -362,7 +362,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -404,7 +404,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
foreach (var i in Foo)
- console.Output.WriteLine(i);
+ console.WriteLine(i);
return default;
}
@@ -448,8 +448,8 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -522,9 +522,9 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + SharedContext.Foo);
- console.Output.WriteLine("Bar = " + SharedContext.Bar);
- console.Output.WriteLine("Baz = " + Baz);
+ console.WriteLine("Foo = " + SharedContext.Foo);
+ console.WriteLine("Bar = " + SharedContext.Bar);
+ console.WriteLine("Baz = " + Baz);
return default;
}
@@ -562,7 +562,7 @@ public class OptionBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOu
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(Foo);
+ console.WriteLine(Foo);
return default;
}
}
diff --git a/CliFx.Tests/ParameterBindingSpecs.cs b/CliFx.Tests/ParameterBindingSpecs.cs
index 01318e4..0f7ad44 100644
--- a/CliFx.Tests/ParameterBindingSpecs.cs
+++ b/CliFx.Tests/ParameterBindingSpecs.cs
@@ -28,8 +28,8 @@ public class ParameterBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(tes
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
@@ -76,11 +76,11 @@ public class ParameterBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(tes
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
foreach (var i in Baz)
- console.Output.WriteLine("Baz = " + i);
+ console.WriteLine("Baz = " + i);
return default;
}
@@ -198,8 +198,8 @@ public class ParameterBindingSpecs(ITestOutputHelper testOutput) : SpecsBase(tes
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("Foo = " + Foo);
- console.Output.WriteLine("Bar = " + Bar);
+ console.WriteLine("Foo = " + Foo);
+ console.WriteLine("Bar = " + Bar);
return default;
}
diff --git a/CliFx.Tests/RoutingSpecs.cs b/CliFx.Tests/RoutingSpecs.cs
index 0a36a1e..a302e67 100644
--- a/CliFx.Tests/RoutingSpecs.cs
+++ b/CliFx.Tests/RoutingSpecs.cs
@@ -22,7 +22,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("default");
+ console.WriteLine("default");
return default;
}
}
@@ -32,7 +32,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd");
+ console.WriteLine("cmd");
return default;
}
}
@@ -42,7 +42,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd child");
+ console.WriteLine("cmd child");
return default;
}
}
@@ -79,7 +79,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("default");
+ console.WriteLine("default");
return default;
}
}
@@ -89,7 +89,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd");
+ console.WriteLine("cmd");
return default;
}
}
@@ -99,7 +99,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd child");
+ console.WriteLine("cmd child");
return default;
}
}
@@ -133,7 +133,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("default");
+ console.WriteLine("default");
return default;
}
}
@@ -143,7 +143,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd");
+ console.WriteLine("cmd");
return default;
}
}
@@ -153,7 +153,7 @@ public class RoutingSpecs(ITestOutputHelper testOutput) : SpecsBase(testOutput)
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("cmd child");
+ console.WriteLine("cmd child");
return default;
}
}
diff --git a/CliFx.Tests/TypeActivationSpecs.cs b/CliFx.Tests/TypeActivationSpecs.cs
index 035f6d3..24c1ad3 100644
--- a/CliFx.Tests/TypeActivationSpecs.cs
+++ b/CliFx.Tests/TypeActivationSpecs.cs
@@ -24,7 +24,7 @@ public class TypeActivationSpecs(ITestOutputHelper testOutput) : SpecsBase(testO
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("foo");
+ console.WriteLine("foo");
return default;
}
}
@@ -102,7 +102,7 @@ public class TypeActivationSpecs(ITestOutputHelper testOutput) : SpecsBase(testO
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(_foo);
+ console.WriteLine(_foo);
return default;
}
}
@@ -144,7 +144,7 @@ public class TypeActivationSpecs(ITestOutputHelper testOutput) : SpecsBase(testO
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine(_foo);
+ console.WriteLine(_foo);
return default;
}
}
@@ -195,7 +195,7 @@ public class TypeActivationSpecs(ITestOutputHelper testOutput) : SpecsBase(testO
{
public ValueTask ExecuteAsync(IConsole console)
{
- console.Output.WriteLine("foo");
+ console.WriteLine("foo");
return default;
}
}
diff --git a/CliFx/Attributes/CommandOptionAttribute.cs b/CliFx/Attributes/CommandOptionAttribute.cs
index 96d237a..517a56b 100644
--- a/CliFx/Attributes/CommandOptionAttribute.cs
+++ b/CliFx/Attributes/CommandOptionAttribute.cs
@@ -35,7 +35,7 @@ public sealed class CommandOptionAttribute : Attribute
///
public CommandOptionAttribute(char shortName)
: this(null, (char?)shortName) { }
-
+
///
/// Option name.
///
diff --git a/CliFx/CliApplication.cs b/CliFx/CliApplication.cs
index 061e3c3..bb06d07 100644
--- a/CliFx/CliApplication.cs
+++ b/CliFx/CliApplication.cs
@@ -88,7 +88,7 @@ public class CliApplication(
// Handle the preview directive
if (IsPreviewModeEnabled(commandInput))
{
- console.Output.WriteCommandInput(commandInput);
+ console.WriteCommandInput(commandInput);
return 0;
}
@@ -125,14 +125,14 @@ public class CliApplication(
// Handle the help option
if (ShouldShowHelpText(commandSchema, commandInput))
{
- console.Output.WriteHelpText(helpContext);
+ console.WriteHelpText(helpContext);
return 0;
}
// Handle the version option
if (ShouldShowVersionText(commandSchema, commandInput))
{
- console.Output.WriteLine(Metadata.Version);
+ console.WriteLine(Metadata.Version);
return 0;
}
@@ -150,12 +150,12 @@ public class CliApplication(
}
catch (CliFxException ex)
{
- console.Error.WriteException(ex);
+ console.WriteException(ex);
if (ex.ShowHelp)
{
- console.Output.WriteLine();
- console.Output.WriteHelpText(helpContext);
+ console.WriteLine();
+ console.WriteHelpText(helpContext);
}
return ex.ExitCode;
@@ -195,7 +195,7 @@ public class CliApplication(
// developer, so we don't swallow them in that case.
catch (Exception ex) when (!Debugger.IsAttached)
{
- console.Error.WriteException(ex);
+ console.WriteException(ex);
return 1;
}
}
diff --git a/CliFx/Formatting/CommandInputConsoleFormatter.cs b/CliFx/Formatting/CommandInputConsoleFormatter.cs
index 5d62bf4..fd9a9d6 100644
--- a/CliFx/Formatting/CommandInputConsoleFormatter.cs
+++ b/CliFx/Formatting/CommandInputConsoleFormatter.cs
@@ -92,4 +92,7 @@ internal static class CommandInputConsoleFormatterExtensions
this ConsoleWriter consoleWriter,
CommandInput commandInput
) => new CommandInputConsoleFormatter(consoleWriter).WriteCommandInput(commandInput);
+
+ public static void WriteCommandInput(this IConsole console, CommandInput commandInput) =>
+ console.Output.WriteCommandInput(commandInput);
}
diff --git a/CliFx/Formatting/ExceptionConsoleFormatter.cs b/CliFx/Formatting/ExceptionConsoleFormatter.cs
index 6772d56..829dd0f 100644
--- a/CliFx/Formatting/ExceptionConsoleFormatter.cs
+++ b/CliFx/Formatting/ExceptionConsoleFormatter.cs
@@ -122,4 +122,7 @@ internal static class ExceptionConsoleFormatterExtensions
{
public static void WriteException(this ConsoleWriter consoleWriter, Exception exception) =>
new ExceptionConsoleFormatter(consoleWriter).WriteException(exception);
+
+ public static void WriteException(this IConsole console, Exception exception) =>
+ console.Error.WriteException(exception);
}
diff --git a/CliFx/Formatting/HelpConsoleFormatter.cs b/CliFx/Formatting/HelpConsoleFormatter.cs
index ebab1c0..982653b 100644
--- a/CliFx/Formatting/HelpConsoleFormatter.cs
+++ b/CliFx/Formatting/HelpConsoleFormatter.cs
@@ -458,4 +458,7 @@ internal static class HelpConsoleFormatterExtensions
{
public static void WriteHelpText(this ConsoleWriter consoleWriter, HelpContext context) =>
new HelpConsoleFormatter(consoleWriter, context).WriteHelpText();
+
+ public static void WriteHelpText(this IConsole console, HelpContext context) =>
+ console.Output.WriteHelpText(context);
}
diff --git a/CliFx/Infrastructure/IConsole.cs b/CliFx/Infrastructure/IConsole.cs
index 50e5c39..23a4664 100644
--- a/CliFx/Infrastructure/IConsole.cs
+++ b/CliFx/Infrastructure/IConsole.cs
@@ -108,6 +108,43 @@ public interface IConsole
///
public static class ConsoleExtensions
{
+ ///
+ /// Writes a string to the console's output stream.
+ ///
+ public static void Write(this IConsole console, string? value) => console.Output.Write(value);
+
+ ///
+ /// Writes an object to the console's output stream.
+ ///
+ public static void Write(this IConsole console, object? value) => console.Output.Write(value);
+
+ ///
+ /// Writes an empty line to the console's output stream.
+ ///
+ public static void WriteLine(this IConsole console) => console.Output.WriteLine();
+
+ ///
+ /// Writes a string to the console's output stream, followed by a line terminator.
+ ///
+ public static void WriteLine(this IConsole console, string? value) =>
+ console.Output.WriteLine(value);
+
+ ///
+ /// Writes an object to the console's output stream, followed by a line terminator.
+ ///
+ public static void WriteLine(this IConsole console, object? value) =>
+ console.Output.WriteLine(value);
+
+ ///
+ /// Reads a single character from the console's input stream.
+ ///
+ public static int Read(this IConsole console) => console.Input.Read();
+
+ ///
+ /// Reads a line from the console's input stream.
+ ///
+ public static string? ReadLine(this IConsole console) => console.Input.ReadLine();
+
///
/// Sets the specified foreground color and returns an
/// that will reset the color back to its previous value upon disposal.