From c293e3ab4f35ef6cac354e70cf5e6e1983a9c121 Mon Sep 17 00:00:00 2001
From: darthsharp <48331467+darthsharp@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:53:21 +0100
Subject: [PATCH 1/4] Add options validation support in `DefaultCliHost`:
- Introduce `UseValidation` in `ICliHostBuilder` and `CliHostSettings` to enable command options validation.
- Add `IOptionsValidation` interface and `OptionsValidationResult` for asynchronous options validation.
- Enhance `DefaultCliHost` with validation logic and custom `CliCommandOptionsInvalidException`.
- Extend `CliExitCodes` with `CommandOptionsInvalid`.
- Add and update unit tests to cover validation scenarios.
---
.../CreativeCoders.Cli.Core/CommandResult.cs | 10 +
.../IOptionsValidation.cs | 13 +
.../OptionsValidationResult.cs | 19 ++
.../CliExitCodes.cs | 2 +
.../DefaultCliHost.cs | 54 +++-
.../DefaultCliHostBuilder.cs | 19 ++
.../CliCommandOptionsInvalidException.cs | 10 +
.../CreativeCoders.Cli.Hosting/ICliHost.cs | 7 +
.../ICliHostBuilder.cs | 7 +
.../Hosting/DefaultCliHostBuilderTests.cs | 64 +++++
.../Hosting/DefaultCliHostTests.cs | 235 +++++++++++++++++-
11 files changed, 430 insertions(+), 10 deletions(-)
create mode 100644 source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs
create mode 100644 source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs
create mode 100644 source/Cli/CreativeCoders.Cli.Hosting/Exceptions/CliCommandOptionsInvalidException.cs
diff --git a/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs b/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
index 5418023a..3d4d2595 100644
--- a/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
+++ b/source/Cli/CreativeCoders.Cli.Core/CommandResult.cs
@@ -1,6 +1,16 @@
+using JetBrains.Annotations;
+
namespace CreativeCoders.Cli.Core;
+[PublicAPI]
public class CommandResult
{
+ public CommandResult() { }
+
+ public CommandResult(int exitCode) : this()
+ {
+ ExitCode = exitCode;
+ }
+
public int ExitCode { get; init; }
}
diff --git a/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs b/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs
new file mode 100644
index 00000000..df23710e
--- /dev/null
+++ b/source/Cli/CreativeCoders.Cli.Core/IOptionsValidation.cs
@@ -0,0 +1,13 @@
+namespace CreativeCoders.Cli.Core;
+
+///
+/// Interface for command options validation.
+///
+public interface IOptionsValidation
+{
+ ///
+ /// Validates the command options asynchronously.
+ ///
+ /// A indicating the result of the validation.
+ Task ValidateAsync();
+}
diff --git a/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs b/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs
new file mode 100644
index 00000000..523d2f72
--- /dev/null
+++ b/source/Cli/CreativeCoders.Cli.Core/OptionsValidationResult.cs
@@ -0,0 +1,19 @@
+namespace CreativeCoders.Cli.Core;
+
+///
+/// Represents the result of a command options validation.
+///
+/// A boolean value indicating whether the options are valid.
+/// An optional collection of validation messages.
+public class OptionsValidationResult(bool isValid, IEnumerable? messages = null)
+{
+ ///
+ /// Gets a value indicating whether the validation was successful.
+ ///
+ public bool IsValid { get; } = isValid;
+
+ ///
+ /// Gets the validation messages.
+ ///
+ public IEnumerable Messages { get; } = messages ?? [];
+}
diff --git a/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs b/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
index d7500d06..1a5a1832 100644
--- a/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
+++ b/source/Cli/CreativeCoders.Cli.Hosting/CliExitCodes.cs
@@ -9,4 +9,6 @@ public static class CliExitCodes
public const int CommandCreationFailed = int.MinValue + 1;
public const int CommandResultUnknown = int.MinValue + 2;
+
+ public const int CommandOptionsInvalid = int.MinValue + 3;
}
diff --git a/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs b/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
index bf718202..189fb331 100644
--- a/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
+++ b/source/Cli/CreativeCoders.Cli.Hosting/DefaultCliHost.cs
@@ -5,6 +5,7 @@
using CreativeCoders.Cli.Hosting.Exceptions;
using CreativeCoders.Cli.Hosting.Help;
using CreativeCoders.Core;
+using CreativeCoders.Core.Collections;
using CreativeCoders.Core.Reflection;
using CreativeCoders.SysConsole.Cli.Parsing;
using Microsoft.Extensions.DependencyInjection;
@@ -27,6 +28,9 @@ public class DefaultCliHost(
private readonly ICliCommandHelpHandler _commandHelpHandler = Ensure.NotNull(commandHelpHandler);
+ private readonly CliHostSettings _settings =
+ serviceProvider.GetService() ?? new CliHostSettings();
+
private (object Command, string[] Args, CliCommandInfo CommandInfo) CreateCliCommand(string[] args)
{
var findCommandNodeResult = _commandStore.FindCommandNode(args);
@@ -43,7 +47,7 @@ public class DefaultCliHost(
var command =
commandInfo.CommandType.CreateInstance