From 5a98205bad6567f365366ba48c7002814f697490 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Mon, 16 Oct 2023 19:43:55 -0300 Subject: [PATCH] cleaning and Disposable.Defer --- Directory.Build.props | 35 +++--- src/Disposable.cs | 52 +++++++++ src/EnumerablePlus/LinqArrayExtensions.cs | 2 - src/EnumerablePlus/StringEnumerablePlus.cs | 4 +- src/EnumerationExtensions.cs | 109 ------------------ .../DateTimeUtcOnlyJsonConverter.cs | 2 + .../CSharpPlus.Tests/CSharpPlus.Tests.csproj | 82 +++++++------ .../EnumerablePlus/LinqEnumerablePlusTests.cs | 4 +- .../LinqArrayExtensionsTests.cs | 2 - 9 files changed, 116 insertions(+), 176 deletions(-) create mode 100644 src/Disposable.cs delete mode 100644 src/EnumerationExtensions.cs diff --git a/Directory.Build.props b/Directory.Build.props index 21a3991..6b3e643 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,23 +1,24 @@ - - - + + enable - CS8600;CS8602;CS8603;CS8604;CS8625;CS8618;CS8620;CS0219 + enable + true + true + CS8600;CS8602;CS8603;CS8604;CS8625;CS8618;CS8620 + true + $(NoWarn);CS1591;CS1573 - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + diff --git a/src/Disposable.cs b/src/Disposable.cs new file mode 100644 index 0000000..04e08fa --- /dev/null +++ b/src/Disposable.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading.Tasks; + +namespace CSharpPlus; + +/// +/// Disposable static functions +/// +public static class Disposable +{ + /// + public readonly struct Deferred : IDisposable + { + readonly Action action; + + /// + /// Create new deferred context + /// + public Deferred(Action action) => this.action = action; + + /// + public void Dispose() => action?.Invoke(); + } + + /// + public readonly struct DeferredTask : IAsyncDisposable + { + readonly Func action; + + /// + /// Create new deferred context + /// + public DeferredTask(Func action) => this.action = action; + + /// + public async ValueTask DisposeAsync() + { + if (action is not null) + await action(); + } + } + + /// + /// Defer action execution with Dispose + /// + public static Deferred Defer(Action action) => new(action); + + /// + /// Defer async action execution with DisposeAsync + /// + public static DeferredTask Defer(Func action) => new(action); +} diff --git a/src/EnumerablePlus/LinqArrayExtensions.cs b/src/EnumerablePlus/LinqArrayExtensions.cs index 8049d7d..ced1d17 100644 --- a/src/EnumerablePlus/LinqArrayExtensions.cs +++ b/src/EnumerablePlus/LinqArrayExtensions.cs @@ -1,5 +1,3 @@ -namespace CSharpPlus.LinqArray; - using System; using System.Collections.Generic; diff --git a/src/EnumerablePlus/StringEnumerablePlus.cs b/src/EnumerablePlus/StringEnumerablePlus.cs index 9f8771e..f741829 100644 --- a/src/EnumerablePlus/StringEnumerablePlus.cs +++ b/src/EnumerablePlus/StringEnumerablePlus.cs @@ -27,7 +27,7 @@ public static partial class EnumerablePlus /// /// /// - public static string JoinAsString(this IEnumerable values, char separator) => + public static string JoinNewString(this IEnumerable values, char separator) => string.Join(separator, values); /// @@ -35,7 +35,7 @@ public static partial class EnumerablePlus /// /// /// - public static string JoinAsString(this IEnumerable values, string separator) => + public static string JoinNewString(this IEnumerable values, string separator) => string.Join(separator, values); diff --git a/src/EnumerationExtensions.cs b/src/EnumerationExtensions.cs deleted file mode 100644 index c6cde6f..0000000 --- a/src/EnumerationExtensions.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; - -/// -/// Enum extensions -/// -public static class EnumerationExtensions -{ - static object? GetAttribute(Type enumType, Type attributeType, string? value) => - value is null || !enumType.IsEnum - ? null - : enumType - .GetMember(value) - .SelectMany(p => p.GetCustomAttributes(attributeType, true)) - .FirstOrDefault(); - - static TAttr? GetAttribute(this TEnum value) - where TEnum : Enum - where TAttr : Attribute => - GetAttribute(value.GetType(), typeof(TAttr), value.ToString()) as TAttr; - - /// - /// Get description from EnumMember.Value Attribute - /// - public static string? GetEnumMemberValue(object @enum) => - GetAttribute(@enum.GetType(), typeof(EnumMemberAttribute), @enum.ToString()) is - EnumMemberAttribute - { - Value: { } description, - } - ? description - : @enum.ToString(); - - /// - /// Get enum description from EnumMember.Value Attribute - /// - /// - /// - /// - public static string GetEnumMemberValue(this T @enum) where T : Enum => - @enum - .GetAttribute() is { Value: { } description } - ? description - : @enum.ToString(); - - /// - /// Get enum description from DescriptionAttribute - /// - /// - /// - /// - public static string GetDescription(this T @enum) where T : Enum => @enum - .GetAttribute() is { Description: { } description } - ? description - : @enum.ToString(); - - - /// - /// Get description from DescriptionAttribute - /// - public static string? GetDescription(object @enum) => - GetAttribute(@enum.GetType(), typeof(DescriptionAttribute), @enum.ToString()) is - DescriptionAttribute - { - Description: { } description, - } - ? description - : @enum.ToString(); - - static TEnum? GetEnumByString( - string enumDescription, - Func getString, - StringComparison comparison = StringComparison.Ordinal) - where TEnum : struct, Enum => - Enum.GetValues() - .Select(e => (Value: e, Desc: getString(e))) - .Where(x => string.Equals(x.Desc, enumDescription, comparison)) - .Select(x => x.Value) - .FirstOrDefault(); - - - /// - /// Return Enum value by description attribute - /// - /// - /// - /// - /// - public static TEnum? GetEnumFromDescription( - string enumDescription, - StringComparison comparison = StringComparison.Ordinal) - where TEnum : struct, Enum => - GetEnumByString(enumDescription, e => e.GetDescription(), comparison); - - /// - /// Return Enum value by EnumMember attribute value - /// - /// - /// - /// - /// - public static TEnum? GetEnumFromEnumMemberValue( - string enumDescription, - StringComparison comparison = StringComparison.Ordinal) - where TEnum : struct, Enum => - GetEnumByString(enumDescription, e => e.GetEnumMemberValue(), comparison); -} diff --git a/src/JsonConverters/DateTimeUtcOnlyJsonConverter.cs b/src/JsonConverters/DateTimeUtcOnlyJsonConverter.cs index 66503a9..8a4f0be 100644 --- a/src/JsonConverters/DateTimeUtcOnlyJsonConverter.cs +++ b/src/JsonConverters/DateTimeUtcOnlyJsonConverter.cs @@ -31,7 +31,9 @@ public class DateTimeUtcOnlyJsonConverter : JsonConverter { Kind: DateTimeKind.Local } localDate => localDate.ToUniversalTime(), { Kind: DateTimeKind.Unspecified } date => new DateTimeOffset(date.Ticks, offset) .UtcDateTime, +#pragma warning disable S112 _ => throw new IndexOutOfRangeException(nameof(DateTime.Kind)) +#pragma warning restore S112 }; /// diff --git a/tests/CSharpPlus.Tests/CSharpPlus.Tests.csproj b/tests/CSharpPlus.Tests/CSharpPlus.Tests.csproj index 48e9d01..2147c4c 100644 --- a/tests/CSharpPlus.Tests/CSharpPlus.Tests.csproj +++ b/tests/CSharpPlus.Tests/CSharpPlus.Tests.csproj @@ -1,48 +1,46 @@ - - net6.0 - enable - enable + + net6.0 + false + false + - false - + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + diff --git a/tests/CSharpPlus.Tests/EnumerablePlus/LinqEnumerablePlusTests.cs b/tests/CSharpPlus.Tests/EnumerablePlus/LinqEnumerablePlusTests.cs index 92b4a43..8e1f1ce 100644 --- a/tests/CSharpPlus.Tests/EnumerablePlus/LinqEnumerablePlusTests.cs +++ b/tests/CSharpPlus.Tests/EnumerablePlus/LinqEnumerablePlusTests.cs @@ -30,11 +30,11 @@ public void StringJoinSampleTest() [PropertyTest] public void CharJoinChar(char[] values, char chr) => - values.JoinAsString(chr).Should().Be(string.Join(chr, values)); + values.JoinNewString(chr).Should().Be(string.Join(chr, values)); [PropertyTest] public void CharJoinString(char[] value, string str) => - value.JoinAsString(str).Should().Be(string.Join(str, value)); + value.JoinNewString(str).Should().Be(string.Join(str, value)); [PropertyTest] public void StringConcat(string[] values) => diff --git a/tests/CSharpPlus.Tests/LinqArrayExtensionsTests.cs b/tests/CSharpPlus.Tests/LinqArrayExtensionsTests.cs index eade573..2e265ff 100644 --- a/tests/CSharpPlus.Tests/LinqArrayExtensionsTests.cs +++ b/tests/CSharpPlus.Tests/LinqArrayExtensionsTests.cs @@ -1,5 +1,3 @@ -using CSharpPlus.LinqArray; - namespace CSharpPlus.Tests; public class LinqArrayExtensionsTests