ConsoleAsksFor.Microsoft.DependencyInjection
4.0.0
dotnet add package ConsoleAsksFor.Microsoft.DependencyInjection --version 4.0.0
NuGet\Install-Package ConsoleAsksFor.Microsoft.DependencyInjection -Version 4.0.0
<PackageReference Include="ConsoleAsksFor.Microsoft.DependencyInjection" Version="4.0.0" />
paket add ConsoleAsksFor.Microsoft.DependencyInjection --version 4.0.0
#r "nuget: ConsoleAsksFor.Microsoft.DependencyInjection, 4.0.0"
// Install ConsoleAsksFor.Microsoft.DependencyInjection as a Cake Addin #addin nuget:?package=ConsoleAsksFor.Microsoft.DependencyInjection&version=4.0.0 // Install ConsoleAsksFor.Microsoft.DependencyInjection as a Cake Tool #tool nuget:?package=ConsoleAsksFor.Microsoft.DependencyInjection&version=4.0.0
ConsoleAsksFor
ConsoleAsksFor is library for asking input in a console app easily.
Goal
The aim of ConsoleAsksFor is removing the hassle of retrieving/parsing/retrying input in a console app.
Installation
You can download the latest release / pre-release NuGet packages from nuget:
Package: | ||
---|---|---|
ConsoleAsksFor | ||
ConsoleAsksFor.Microsoft.DependencyInjection | ||
ConsoleAsksFor.NodaTime.ISO |
Setup
Register Console with ConsoleAsksFor.Microsoft.DependencyInjection:
services.AddConsoleAsksFor();
Resolve a service which has dependency on IConsole of resolve service directly:
var console = serviceProvider.GetRequiredService<IConsole>();
Or create with factory:
ConsoleFactory.Create();
Start using
Some examples:
var isSure = await console.AskForBool("Are you sure?", cancellationToken: cancellationToken);
var age = await console.AskForInt("What is your age?", Between(0, 125));
var length = await console.AskForDecimal("What is your length (in meters)?", Scale.Two, Between(0m, 2.5m));
var appointmentStart = await console.AskForDateTimeOffset("How late should we meet?", TimeZoneInfo.Local, AtLeast(DateTimeOffset.Now), defaultValue: DateTimeOffset.Now.AddHours(1));
var favoriteColor = await console.AskForEnum<ConsoleColor>("What is your favorite color?");
var preferredName = await console.AskForItem("Which name do you prefer?", ["Jantje", "Pietje"]);
var directory = await console.AskForExistingDirectory("Where to store file?", defaultValue: new DirectoryInfo(@"C:\Temp"));
var name = await console.AskForString("What is your name?");
var zipcode = await console.AskForString("What is your Dutch zipcode?", new Regex("^[1-9][0-9]{3}[A-Z]{2}$"), "Format: '5555AA' where first digit is not a 0");
var agb = await console.AskForStringBasedValueObject<Agb>("What is your agb?", Agb.TryParse, x => x.ToString(), "8 numbers");
var uzovi = await console.AskForStringBasedValueObject<Uzovi>("What is your uzovi?", "4 numbers"); // Uzovi implements IParsable<Uzovi> and IFormattable
var pw = await console.AskForPassword("What is the secret code?");
Demo
var console = ConsoleFactory.Create();
console.WriteInfoLine("Tip: Use arrows to go through history.");
var wordOfTheDay = await console.AskForString("What is your word of the day?");
console.WriteInfoLine("Tip: Use tab for intellisense.");
var likableWords = await console.AskForItems("Which of these words do you like?", ["Whale", "Yesterday", "Some", "Stereo", "Random"]);
Features
- Default values
- History
- ByQuestionTextAndType (default)
- ByQuestionType
- NotFiltered
- Basic Intellisense
- Colors
- Visual feedback whether current answer is correct
- Different colors for different line types
- Customizable
- Cancelable
- Support for cancellationTokens
- Push F12 to throw TaskCanceledByF12Exception
- Basic multithreading support:
- During asking questions other output to Console is suspended
- When multiple threads are asking questions, questions are queued
Supported types
ConsoleAsksFor
- AskForBool
- AskForByte
- AskForSignedByte
- AskForShort
- AskForUnsignedShort
- AskForInt
- AskForUnsignedInt
- AskForLong
- AskForUnsignedLong
- AskForDecimal
- AskForDateOnly
- AskForTimeOnly
- AskForDateTime
- AskForDateTimeOffset
- AskForTimeSpan
- AskForDirectory
- AskForExistingDirectory
- AskForNewDirectory
- AskForFileName
- AskForExistingFileName
- AskForNewFileName
- AskForEnum<T>
- AskForFlaggedEnum<T>
- AskForItem<T>
- AskForItems<T>
- AskForString
- AskForStringBasedValueObject<T>
- AskForPassword
ConsoleAsksFor.NodaTime.ISO
- AskForInstant
- AskForLocalDate
- AskForLocalDateTime
- AskForLocalTime
- AskForZonedDateTime
- AskForAnnualDate
- AskForYearMonth
Release notes
See the Releases page.
Versioning
ConsoleAsksFor follows Semantic Versioning 2.0.0 for the releases published to nuget.org.
Credits
- Sergey Shumov for showing his AsyncAutoResetEvent.
- Jerrie Pelser for showing how to enable ansi colors in windows.
- JSQuareD for showing how to cancel Console.ReadKey.
- Sergey for showing how to lock resource in combination with async/await.
- Asbjørn Ulsberg for showing how to get amount of digits after decimal point.
Other
Another reason to make ConsoleAsksFor is because I have never worked with github and never created public nuget package. So this is a little brain exercise I guess 😃.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- ConsoleAsksFor (>= 4.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
4.0.0 | 93 | 11/3/2024 |
3.1.0 | 316 | 12/27/2022 |
3.0.0 | 431 | 5/10/2022 |
2.0.0 | 270 | 12/31/2021 |
2.0.0-prerelease-2021123111... | 153 | 12/31/2021 |
1.0.0 | 363 | 10/4/2021 |
1.0.0-prerelease-2021100310... | 284 | 10/3/2021 |