From 310f56fb84519c4267e4044b995c921463920235 Mon Sep 17 00:00:00 2001
From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com>
Date: Wed, 23 Jul 2025 23:55:56 -0500
Subject: [PATCH] feat: wip...migrating to proper app
---
.editorconfig | 6 +-
src/Directory.packages.props | 8 ++
src/StreamShorts.Console/.editorconfig | 2 +-
.../Commands/DefaultCommand.cs | 45 ++++++++++
.../Hosting/HostBuilderExtensions.cs | 21 +++++
.../Hosting/TypeRegistrar.cs | 28 ++++++
.../Hosting/TypeResolver.cs | 16 ++++
src/StreamShorts.Console/Program.cs | 64 ++++++++------
.../Resources/Resources.resx | 12 ---
.../StreamShorts.Console.csproj | 8 ++
src/StreamShorts.Console/Usings.cs | 18 ++++
.../Media/Audio/IAudioExtractor.cs | 0
.../Media/Video/IShortsCreator.cs | 0
tests/.editorconfig | 2 +
tests/Directory.Packages.props | 22 ++---
.../StreamShorts.Console.Tests.csproj | 3 +
.../Unit/Hosting/TypeRegistrarTests.cs | 88 +++++++++++++++++++
.../Unit/Hosting/TypeResolverTests.cs | 73 +++++++++++++++
tests/StreamShorts.Console.Tests/UnitTest1.cs | 10 ---
tests/StreamShorts.Console.Tests/Usings.cs | 8 ++
20 files changed, 370 insertions(+), 64 deletions(-)
create mode 100644 src/StreamShorts.Console/Commands/DefaultCommand.cs
create mode 100644 src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs
create mode 100644 src/StreamShorts.Console/Hosting/TypeRegistrar.cs
create mode 100644 src/StreamShorts.Console/Hosting/TypeResolver.cs
delete mode 100644 src/StreamShorts.Console/Resources/Resources.resx
create mode 100644 src/StreamShorts.Console/Usings.cs
create mode 100644 src/StreamShorts.Library/Media/Audio/IAudioExtractor.cs
create mode 100644 src/StreamShorts.Library/Media/Video/IShortsCreator.cs
create mode 100644 tests/.editorconfig
create mode 100644 tests/StreamShorts.Console.Tests/Unit/Hosting/TypeRegistrarTests.cs
create mode 100644 tests/StreamShorts.Console.Tests/Unit/Hosting/TypeResolverTests.cs
delete mode 100644 tests/StreamShorts.Console.Tests/UnitTest1.cs
create mode 100644 tests/StreamShorts.Console.Tests/Usings.cs
diff --git a/.editorconfig b/.editorconfig
index 398cb36..0adf1e7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -23,6 +23,10 @@ insert_final_newline = false
#### .NET Coding Conventions ####
[*.{cs,vb}]
+# Diagnostic severity preferences
+dotnet_diagnostic.IDE0058.severity = none
+dotnet_diagnostic.IDE0100.severity = none
+
# Organize usings
dotnet_separate_import_directive_groups = true
dotnet_sort_system_directives_first = true
@@ -59,7 +63,7 @@ dotnet_style_prefer_auto_properties = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
-dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = false:silent
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
diff --git a/src/Directory.packages.props b/src/Directory.packages.props
index 5ce8323..0f718b5 100644
--- a/src/Directory.packages.props
+++ b/src/Directory.packages.props
@@ -6,7 +6,15 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/StreamShorts.Console/.editorconfig b/src/StreamShorts.Console/.editorconfig
index 79a8d3d..2dc531e 100644
--- a/src/StreamShorts.Console/.editorconfig
+++ b/src/StreamShorts.Console/.editorconfig
@@ -1,2 +1,2 @@
[*.cs]
-dotnet_diagnostic.CA2007.severity = none
\ No newline at end of file
+dotnet_diagnostic.CA2007.severity = none
diff --git a/src/StreamShorts.Console/Commands/DefaultCommand.cs b/src/StreamShorts.Console/Commands/DefaultCommand.cs
new file mode 100644
index 0000000..60ae4fe
--- /dev/null
+++ b/src/StreamShorts.Console/Commands/DefaultCommand.cs
@@ -0,0 +1,45 @@
+namespace StreamShorts.Console.Commands;
+
+internal class DefaultCommand(
+ IFileSystem fileSystem,
+ IAnsiConsole console
+) : AsyncCommand
+{
+ private readonly IFileSystem _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
+ private readonly IAnsiConsole _console = console ?? throw new ArgumentNullException(nameof(console));
+
+ internal class Settings : CommandSettings
+ {
+ [CommandArgument(0, "[Stream]")]
+ [Description("The path to the stream")]
+ public string Stream { get; init; } = string.Empty;
+ }
+
+ public override ValidationResult Validate(CommandContext context, Settings settings)
+ {
+ if (string.IsNullOrWhiteSpace(settings.Stream))
+ {
+ return ValidationResult.Error("Stream path must be provided.");
+ }
+
+ if (_fileSystem.File.Exists(settings.Stream) is false)
+ {
+ return ValidationResult.Error($"The specified stream file '{settings.Stream}' does not exist.");
+ }
+
+ var fileExtension = _fileSystem.Path.GetExtension(settings.Stream).ToUpperInvariant();
+
+ if (fileExtension != ".MP4")
+ {
+ return ValidationResult.Error("The specified stream file must be an .mp4 file.");
+ }
+
+ return base.Validate(context, settings);
+ }
+
+ public override Task ExecuteAsync(CommandContext context, Settings settings)
+ {
+ _console.Write($"[green]Processing stream:[/] {settings.Stream}");
+ return Task.FromResult(0);
+ }
+}
\ No newline at end of file
diff --git a/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs b/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs
new file mode 100644
index 0000000..4b4bdd6
--- /dev/null
+++ b/src/StreamShorts.Console/Hosting/HostBuilderExtensions.cs
@@ -0,0 +1,21 @@
+namespace StreamShorts.Console.Hosting;
+
+internal static class HostBuilderExtensions
+{
+ public static CommandApp BuildApp(this IHostBuilder builder)
+ {
+ var registrar = new TypeRegistrar(builder);
+ var app = new CommandApp(registrar);
+
+ app.Configure(static c =>
+ c.SetExceptionHandler(static (ex, resolver) =>
+ {
+ var console = resolver?.Resolve(typeof(IAnsiConsole)) as IAnsiConsole;
+ console?.WriteLine($"[red]An error occurred while executing the command:[/]");
+ console?.WriteException(ex, ExceptionFormats.ShortenEverything);
+ })
+ );
+
+ return app;
+ }
+}
\ No newline at end of file
diff --git a/src/StreamShorts.Console/Hosting/TypeRegistrar.cs b/src/StreamShorts.Console/Hosting/TypeRegistrar.cs
new file mode 100644
index 0000000..50ab983
--- /dev/null
+++ b/src/StreamShorts.Console/Hosting/TypeRegistrar.cs
@@ -0,0 +1,28 @@
+namespace StreamShorts.Console.Hosting;
+
+internal class TypeRegistrar(IHostBuilder builder) : ITypeRegistrar
+{
+ private readonly IHostBuilder _builder = builder;
+
+ public ITypeResolver Build()
+ {
+ return new TypeResolver(_builder.Build());
+ }
+
+ public void Register(Type service, Type implementation)
+ {
+ _builder.ConfigureServices((_, services) => services.AddSingleton(service, implementation));
+ }
+
+ public void RegisterInstance(Type service, object implementation)
+ {
+ _builder.ConfigureServices((_, services) => services.AddSingleton(service, implementation));
+ }
+
+ public void RegisterLazy(Type service, Func