diff --git a/CliFx.Generators/Binding/CommandInputSymbol.cs b/CliFx.Generators/Binding/CommandInputSymbol.cs
index 0349c5f1..b35279c8 100644
--- a/CliFx.Generators/Binding/CommandInputSymbol.cs
+++ b/CliFx.Generators/Binding/CommandInputSymbol.cs
@@ -2,6 +2,7 @@
using System.Linq;
using CliFx.Generators.Utils.Extensions;
using Microsoft.CodeAnalysis;
+using PowerKit.Extensions;
namespace CliFx.Generators.Binding;
diff --git a/CliFx.Generators/Binding/CommandOptionSymbol.cs b/CliFx.Generators/Binding/CommandOptionSymbol.cs
index 978ebd0b..4b0e15c9 100644
--- a/CliFx.Generators/Binding/CommandOptionSymbol.cs
+++ b/CliFx.Generators/Binding/CommandOptionSymbol.cs
@@ -5,6 +5,7 @@
using CliFx.Generators.Utils;
using CliFx.Generators.Utils.Extensions;
using Microsoft.CodeAnalysis;
+using PowerKit.Extensions;
namespace CliFx.Generators.Binding;
diff --git a/CliFx.Generators/Binding/CommandParameterSymbol.cs b/CliFx.Generators/Binding/CommandParameterSymbol.cs
index 47216c11..ccab9f65 100644
--- a/CliFx.Generators/Binding/CommandParameterSymbol.cs
+++ b/CliFx.Generators/Binding/CommandParameterSymbol.cs
@@ -5,6 +5,7 @@
using CliFx.Generators.Utils;
using CliFx.Generators.Utils.Extensions;
using Microsoft.CodeAnalysis;
+using PowerKit.Extensions;
namespace CliFx.Generators.Binding;
diff --git a/CliFx.Generators/CliFx.Generators.csproj b/CliFx.Generators/CliFx.Generators.csproj
index c6cc4b2c..27b4051b 100644
--- a/CliFx.Generators/CliFx.Generators.csproj
+++ b/CliFx.Generators/CliFx.Generators.csproj
@@ -15,5 +15,6 @@
+
diff --git a/CliFx.Generators/CommandDescriptorGenerator.cs b/CliFx.Generators/CommandDescriptorGenerator.cs
index 0c0b910c..eae01069 100644
--- a/CliFx.Generators/CommandDescriptorGenerator.cs
+++ b/CliFx.Generators/CommandDescriptorGenerator.cs
@@ -9,6 +9,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
+using PowerKit.Extensions;
namespace CliFx.Generators;
diff --git a/CliFx.Generators/Emitters/CommandDescriptor.cs b/CliFx.Generators/Emitters/CommandDescriptor.cs
index 0cda9ad5..8f14af35 100644
--- a/CliFx.Generators/Emitters/CommandDescriptor.cs
+++ b/CliFx.Generators/Emitters/CommandDescriptor.cs
@@ -5,6 +5,7 @@
using CliFx.Generators.Utils;
using CliFx.Generators.Utils.Extensions;
using Microsoft.CodeAnalysis;
+using PowerKit.Extensions;
namespace CliFx.Generators.Emitters;
diff --git a/CliFx.Generators/Emitters/CommandRegistration.cs b/CliFx.Generators/Emitters/CommandRegistration.cs
index 34ad8351..6f27180d 100644
--- a/CliFx.Generators/Emitters/CommandRegistration.cs
+++ b/CliFx.Generators/Emitters/CommandRegistration.cs
@@ -5,6 +5,7 @@
using CliFx.Generators.Utils;
using CliFx.Generators.Utils.Extensions;
using Microsoft.CodeAnalysis;
+using PowerKit.Extensions;
namespace CliFx.Generators.Emitters;
diff --git a/CliFx.Generators/Utils/Extensions/CollectionExtensions.cs b/CliFx.Generators/Utils/Extensions/CollectionExtensions.cs
deleted file mode 100644
index b3a5b39d..00000000
--- a/CliFx.Generators/Utils/Extensions/CollectionExtensions.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System.Collections.Generic;
-
-namespace CliFx.Generators.Utils.Extensions;
-
-internal static class CollectionExtensions
-{
- extension(IEnumerable source)
- {
- public IEnumerable WhereNotNull()
- {
- foreach (var item in source)
- {
- if (item is not null)
- yield return item;
- }
- }
- }
-}
diff --git a/CliFx.Generators/Utils/Extensions/StringExtensions.cs b/CliFx.Generators/Utils/Extensions/StringExtensions.cs
deleted file mode 100644
index 698353db..00000000
--- a/CliFx.Generators/Utils/Extensions/StringExtensions.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Text;
-
-namespace CliFx.Generators.Utils.Extensions;
-
-internal static class StringExtensions
-{
- extension(string str)
- {
- public string? NullIfWhiteSpace() => !string.IsNullOrWhiteSpace(str) ? str : null;
-
- public string ToKebabCase()
- {
- var buffer = new StringBuilder();
- var lastCh = default(char?);
-
- foreach (var ch in str)
- {
- if (char.IsUpper(ch))
- {
- if (lastCh is not null && !char.IsUpper(lastCh.Value) && lastCh.Value != '-')
- buffer.Append('-');
-
- buffer.Append(char.ToLowerInvariant(ch));
- }
- else
- {
- buffer.Append(ch);
- }
-
- lastCh = ch;
- }
-
- return buffer.ToString();
- }
- }
-}
diff --git a/CliFx.Tests/CliFx.Tests.csproj b/CliFx.Tests/CliFx.Tests.csproj
index ccf71b26..0858bac6 100644
--- a/CliFx.Tests/CliFx.Tests.csproj
+++ b/CliFx.Tests/CliFx.Tests.csproj
@@ -18,6 +18,7 @@
+
diff --git a/CliFx.Tests/Utils/CommandCompiler.cs b/CliFx.Tests/Utils/CommandCompiler.cs
index b8c2de3a..3d4560db 100644
--- a/CliFx.Tests/Utils/CommandCompiler.cs
+++ b/CliFx.Tests/Utils/CommandCompiler.cs
@@ -6,10 +6,10 @@
using Basic.Reference.Assemblies;
using CliFx.Binding;
using CliFx.Generators;
-using CliFx.Tests.Utils.Extensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Text;
+using PowerKit.Extensions;
namespace CliFx.Tests.Utils;
diff --git a/CliFx.Tests/Utils/Extensions/CollectionExtensions.cs b/CliFx.Tests/Utils/Extensions/CollectionExtensions.cs
deleted file mode 100644
index e1abd06f..00000000
--- a/CliFx.Tests/Utils/Extensions/CollectionExtensions.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System.Collections.Generic;
-
-namespace CliFx.Tests.Utils.Extensions;
-
-internal static class CollectionExtensions
-{
- extension(IEnumerable source)
- {
- public IEnumerable WhereNotNull()
- {
- foreach (var item in source)
- {
- if (item is not null)
- yield return item;
- }
- }
- }
-}
diff --git a/CliFx/Activation/CommandActivator.cs b/CliFx/Activation/CommandActivator.cs
index c0d0ca90..5da85b16 100644
--- a/CliFx/Activation/CommandActivator.cs
+++ b/CliFx/Activation/CommandActivator.cs
@@ -4,7 +4,7 @@
using System.Linq;
using CliFx.Binding;
using CliFx.Parsing;
-using CliFx.Utils.Extensions;
+using PowerKit.Extensions;
namespace CliFx.Activation;
diff --git a/CliFx/Binding/CommandRootDescriptor.cs b/CliFx/Binding/CommandRootDescriptor.cs
index 40b04a7a..b687830c 100644
--- a/CliFx/Binding/CommandRootDescriptor.cs
+++ b/CliFx/Binding/CommandRootDescriptor.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using CliFx.Utils.Extensions;
+using PowerKit.Extensions;
namespace CliFx.Binding;
diff --git a/CliFx/CliFx.csproj b/CliFx/CliFx.csproj
index 47a0d3bb..aa16a981 100644
--- a/CliFx/CliFx.csproj
+++ b/CliFx/CliFx.csproj
@@ -36,6 +36,7 @@
+
environmentVariables
// Handle debug mode
if (
!string.IsNullOrWhiteSpace(configuration.DebugModeEnvironmentVariable)
- && bool.ParseOrDefault(
- environmentVariables.GetValueOrDefault(configuration.DebugModeEnvironmentVariable)
+ && (
+ bool.ParseOrNull(
+ environmentVariables.GetValueOrDefault(
+ configuration.DebugModeEnvironmentVariable
+ )
+ ) ?? false
)
)
{
@@ -55,8 +60,12 @@ IReadOnlyDictionary environmentVariables
// Handle preview mode
if (
!string.IsNullOrWhiteSpace(configuration.PreviewModeEnvironmentVariable)
- && bool.ParseOrDefault(
- environmentVariables.GetValueOrDefault(configuration.PreviewModeEnvironmentVariable)
+ && (
+ bool.ParseOrNull(
+ environmentVariables.GetValueOrDefault(
+ configuration.PreviewModeEnvironmentVariable
+ )
+ ) ?? false
)
)
{
diff --git a/CliFx/CommandLineApplicationBuilder.cs b/CliFx/CommandLineApplicationBuilder.cs
index 0f1c1bf0..99a5a123 100644
--- a/CliFx/CommandLineApplicationBuilder.cs
+++ b/CliFx/CommandLineApplicationBuilder.cs
@@ -4,7 +4,7 @@
using System.Reflection;
using CliFx.Binding;
using CliFx.Infrastructure;
-using CliFx.Utils.Extensions;
+using PowerKit.Extensions;
namespace CliFx;
diff --git a/CliFx/Infrastructure/ConsoleExtensions.cs b/CliFx/Infrastructure/ConsoleExtensions.cs
index 71e385b3..16515332 100644
--- a/CliFx/Infrastructure/ConsoleExtensions.cs
+++ b/CliFx/Infrastructure/ConsoleExtensions.cs
@@ -1,5 +1,5 @@
using System;
-using CliFx.Utils;
+using PowerKit;
namespace CliFx.Infrastructure;
diff --git a/CliFx/Infrastructure/ConsoleWriter.cs b/CliFx/Infrastructure/ConsoleWriter.cs
index 6024c136..52231200 100644
--- a/CliFx/Infrastructure/ConsoleWriter.cs
+++ b/CliFx/Infrastructure/ConsoleWriter.cs
@@ -3,7 +3,7 @@
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
-using CliFx.Utils.Extensions;
+using PowerKit.Extensions;
namespace CliFx.Infrastructure;
diff --git a/CliFx/Parsing/ParsedCommandLine.cs b/CliFx/Parsing/ParsedCommandLine.cs
index 4ac435fa..64804dbf 100644
--- a/CliFx/Parsing/ParsedCommandLine.cs
+++ b/CliFx/Parsing/ParsedCommandLine.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using CliFx.Utils.Extensions;
namespace CliFx.Parsing;
@@ -126,7 +125,7 @@ ref int index
if (!string.IsNullOrWhiteSpace(lastOptionIdentifier))
result.Add(new ParsedOption(lastOptionIdentifier, lastOptionValues));
- lastOptionIdentifier = identifier.AsString();
+ lastOptionIdentifier = identifier.ToString();
lastOptionValues = [];
}
}
diff --git a/CliFx/Utils/Disposable.cs b/CliFx/Utils/Disposable.cs
deleted file mode 100644
index 02484b45..00000000
--- a/CliFx/Utils/Disposable.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace CliFx.Utils;
-
-internal partial class Disposable(Action dispose) : IDisposable
-{
- public void Dispose() => dispose();
-}
-
-internal partial class Disposable
-{
- public static IDisposable Create(Action dispose) => new Disposable(dispose);
-
- public static IDisposable Merge(params IEnumerable disposables) =>
- Create(() =>
- {
- foreach (var disposable in disposables)
- disposable.Dispose();
- });
-}
diff --git a/CliFx/Utils/Extensions/CollectionExtensions.cs b/CliFx/Utils/Extensions/CollectionExtensions.cs
deleted file mode 100644
index 64647f8b..00000000
--- a/CliFx/Utils/Extensions/CollectionExtensions.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace CliFx.Utils.Extensions;
-
-internal static class CollectionExtensions
-{
- extension(IEnumerable source)
- {
- public IEnumerable WhereNotNull()
- {
- foreach (var item in source)
- {
- if (item is not null)
- yield return item;
- }
- }
- }
-
- extension(IEnumerable source)
- {
- public IEnumerable WhereNotNullOrWhiteSpace()
- {
- foreach (var item in source)
- {
- if (!string.IsNullOrWhiteSpace(item))
- yield return item;
- }
- }
- }
-
- extension(ICollection source)
- {
- public void RemoveRange(IEnumerable items)
- {
- foreach (var item in items)
- source.Remove(item);
- }
- }
-
- extension(IDictionary dictionary)
- {
- public Dictionary ToDictionary(IEqualityComparer comparer)
- where TKey : notnull =>
- dictionary
- .Cast()
- .ToDictionary(entry => (TKey)entry.Key, entry => (TValue)entry.Value!, comparer);
- }
-}
diff --git a/CliFx/Utils/Extensions/EncodingExtensions.cs b/CliFx/Utils/Extensions/EncodingExtensions.cs
deleted file mode 100644
index 622b72a5..00000000
--- a/CliFx/Utils/Extensions/EncodingExtensions.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Text;
-
-namespace CliFx.Utils.Extensions;
-
-internal static class EncodingExtensions
-{
- extension(Encoding encoding)
- {
- public Encoding WithoutPreamble() =>
- encoding.GetPreamble().Length > 0 ? new NoPreambleEncoding(encoding) : encoding;
- }
-}
diff --git a/CliFx/Utils/Extensions/PrimitiveExtensions.cs b/CliFx/Utils/Extensions/PrimitiveExtensions.cs
deleted file mode 100644
index 6a9810f0..00000000
--- a/CliFx/Utils/Extensions/PrimitiveExtensions.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace CliFx.Utils.Extensions;
-
-internal static class PrimitiveExtensions
-{
- extension(bool)
- {
- public static bool ParseOrDefault(string? value, bool defaultValue = false)
- {
- if (string.Equals(value, bool.TrueString, StringComparison.OrdinalIgnoreCase))
- return true;
-
- if (string.Equals(value, bool.FalseString, StringComparison.OrdinalIgnoreCase))
- return false;
-
- return defaultValue;
- }
- }
-}
diff --git a/CliFx/Utils/Extensions/StringExtensions.cs b/CliFx/Utils/Extensions/StringExtensions.cs
deleted file mode 100644
index e1d89700..00000000
--- a/CliFx/Utils/Extensions/StringExtensions.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace CliFx.Utils.Extensions;
-
-internal static class StringExtensions
-{
- extension(string str)
- {
- public string? NullIfWhiteSpace() => !string.IsNullOrWhiteSpace(str) ? str : null;
- }
-
- extension(char c)
- {
- public string Repeat(int count) => new(c, count);
-
- public string AsString() => c.Repeat(1);
- }
-}
diff --git a/CliFx/Utils/Extensions/VersionExtensions.cs b/CliFx/Utils/Extensions/VersionExtensions.cs
deleted file mode 100644
index e5483947..00000000
--- a/CliFx/Utils/Extensions/VersionExtensions.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace CliFx.Utils.Extensions;
-
-internal static class VersionExtensions
-{
- extension(Version version)
- {
- public string ToSemanticString() =>
- version.Revision <= 0 ? version.ToString(3) : version.ToString();
- }
-}
diff --git a/CliFx/Utils/NoPreambleEncoding.cs b/CliFx/Utils/NoPreambleEncoding.cs
deleted file mode 100644
index 836a00ff..00000000
--- a/CliFx/Utils/NoPreambleEncoding.cs
+++ /dev/null
@@ -1,143 +0,0 @@
-using System.Diagnostics.CodeAnalysis;
-using System.Text;
-
-namespace CliFx.Utils;
-
-// Adapted from:
-// https://github.com/dotnet/runtime/blob/01b7e73cd378145264a7cb7a09365b41ed42b240/src/libraries/Common/src/System/Text/ConsoleEncoding.cs
-// Also see:
-// https://source.dot.net/#System.Console/ConsoleEncoding.cs,5eedd083a4a4f4a2
-// Majority of overrides are just proxy calls to avoid potentially more expensive base behavior.
-// The important part is the GetPreamble() method that has been overridden to return an empty array.
-internal class NoPreambleEncoding(Encoding underlyingEncoding)
- : Encoding(
- underlyingEncoding.CodePage,
- underlyingEncoding.EncoderFallback,
- underlyingEncoding.DecoderFallback
- )
-{
- // This is the only part that's changed
- public override byte[] GetPreamble() => [];
-
- [ExcludeFromCodeCoverage]
- public override string EncodingName => underlyingEncoding.EncodingName;
-
- [ExcludeFromCodeCoverage]
- public override string BodyName => underlyingEncoding.BodyName;
-
- [ExcludeFromCodeCoverage]
- public override int CodePage => underlyingEncoding.CodePage;
-
- [ExcludeFromCodeCoverage]
- public override int WindowsCodePage => underlyingEncoding.WindowsCodePage;
-
- [ExcludeFromCodeCoverage]
- public override string HeaderName => underlyingEncoding.HeaderName;
-
- [ExcludeFromCodeCoverage]
- public override string WebName => underlyingEncoding.WebName;
-
- [ExcludeFromCodeCoverage]
- public override bool IsBrowserDisplay => underlyingEncoding.IsBrowserDisplay;
-
- [ExcludeFromCodeCoverage]
- public override bool IsBrowserSave => underlyingEncoding.IsBrowserSave;
-
- [ExcludeFromCodeCoverage]
- public override bool IsSingleByte => underlyingEncoding.IsSingleByte;
-
- [ExcludeFromCodeCoverage]
- public override bool IsMailNewsDisplay => underlyingEncoding.IsMailNewsDisplay;
-
- [ExcludeFromCodeCoverage]
- public override bool IsMailNewsSave => underlyingEncoding.IsMailNewsSave;
-
- [ExcludeFromCodeCoverage]
- public override int GetByteCount(char[] chars, int index, int count) =>
- underlyingEncoding.GetByteCount(chars, index, count);
-
- [ExcludeFromCodeCoverage]
- public override int GetByteCount(char[] chars) => underlyingEncoding.GetByteCount(chars);
-
- [ExcludeFromCodeCoverage]
- public override int GetByteCount(string s) => underlyingEncoding.GetByteCount(s);
-
- [ExcludeFromCodeCoverage]
- public override int GetBytes(
- char[] chars,
- int charIndex,
- int charCount,
- byte[] bytes,
- int byteIndex
- ) => underlyingEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex);
-
- [ExcludeFromCodeCoverage]
- public override byte[] GetBytes(char[] chars, int index, int count) =>
- underlyingEncoding.GetBytes(chars, index, count);
-
- [ExcludeFromCodeCoverage]
- public override byte[] GetBytes(char[] chars) => underlyingEncoding.GetBytes(chars);
-
- [ExcludeFromCodeCoverage]
- public override int GetBytes(
- string s,
- int charIndex,
- int charCount,
- byte[] bytes,
- int byteIndex
- ) => underlyingEncoding.GetBytes(s, charIndex, charCount, bytes, byteIndex);
-
- [ExcludeFromCodeCoverage]
- public override byte[] GetBytes(string s) => underlyingEncoding.GetBytes(s);
-
- [ExcludeFromCodeCoverage]
- public override int GetCharCount(byte[] bytes, int index, int count) =>
- underlyingEncoding.GetCharCount(bytes, index, count);
-
- [ExcludeFromCodeCoverage]
- public override int GetCharCount(byte[] bytes) => underlyingEncoding.GetCharCount(bytes);
-
- [ExcludeFromCodeCoverage]
- public override int GetChars(
- byte[] bytes,
- int byteIndex,
- int byteCount,
- char[] chars,
- int charIndex
- ) => underlyingEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex);
-
- [ExcludeFromCodeCoverage]
- public override char[] GetChars(byte[] bytes) => underlyingEncoding.GetChars(bytes);
-
- [ExcludeFromCodeCoverage]
- public override char[] GetChars(byte[] bytes, int index, int count) =>
- underlyingEncoding.GetChars(bytes, index, count);
-
- [ExcludeFromCodeCoverage]
- public override string GetString(byte[] bytes) => underlyingEncoding.GetString(bytes);
-
- [ExcludeFromCodeCoverage]
- public override string GetString(byte[] bytes, int index, int count) =>
- underlyingEncoding.GetString(bytes, index, count);
-
- [ExcludeFromCodeCoverage]
- public override int GetMaxByteCount(int charCount) =>
- underlyingEncoding.GetMaxByteCount(charCount);
-
- [ExcludeFromCodeCoverage]
- public override int GetMaxCharCount(int byteCount) =>
- underlyingEncoding.GetMaxCharCount(byteCount);
-
- [ExcludeFromCodeCoverage]
- public override bool IsAlwaysNormalized(NormalizationForm form) =>
- underlyingEncoding.IsAlwaysNormalized(form);
-
- [ExcludeFromCodeCoverage]
- public override Encoder GetEncoder() => underlyingEncoding.GetEncoder();
-
- [ExcludeFromCodeCoverage]
- public override Decoder GetDecoder() => underlyingEncoding.GetDecoder();
-
- [ExcludeFromCodeCoverage]
- public override object Clone() => new NoPreambleEncoding((Encoding)base.Clone());
-}
diff --git a/CliFx/Utils/StackTraces/StackFrame.cs b/CliFx/Utils/StackTraces/StackFrame.cs
index ed4481c1..c2e30023 100644
--- a/CliFx/Utils/StackTraces/StackFrame.cs
+++ b/CliFx/Utils/StackTraces/StackFrame.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
-using CliFx.Utils.Extensions;
+using PowerKit.Extensions;
namespace CliFx.Utils.StackTraces;
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 9ee95bc7..78305fdb 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -19,7 +19,8 @@
-
+
+