Split extension methods into separate classes (#161)
This PR splits the extension methods contained in `Extensions.cs` into separate classes in the `Octobot.Extensions` namespace. This was done for multiple reasons: 1) The `Extensions.cs` violates SRP (Single Responsibility Principle) - it takes upon itself every extension method for many types 2) Having a separate class for each extended type is a standard practice - take a look at [Remora.Discord](https://github.com/Remora/Remora.Discord/tree/main/Backend/Remora.Discord.Rest/Extensions) or [osu!](https://github.com/ppy/osu/tree/master/osu.Game/Extensions) 3) Having all extension methods in one file makes it hard to find the method you want
This commit is contained in:
parent
20eac79380
commit
e6f53b13f0
31 changed files with 452 additions and 371 deletions
40
src/Extensions/CollectionExtensions.cs
Normal file
40
src/Extensions/CollectionExtensions.cs
Normal file
|
@ -0,0 +1,40 @@
|
|||
using Remora.Results;
|
||||
|
||||
namespace Octobot.Extensions;
|
||||
|
||||
public static class CollectionExtensions
|
||||
{
|
||||
public static TResult? MaxOrDefault<TSource, TResult>(
|
||||
this IEnumerable<TSource> source, Func<TSource, TResult> selector)
|
||||
{
|
||||
var list = source.ToList();
|
||||
return list.Any() ? list.Max(selector) : default;
|
||||
}
|
||||
|
||||
public static void AddIfFailed(this List<Result> list, Result result)
|
||||
{
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
list.Add(result);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return an appropriate result for a list of failed results. The list must only contain failed results.
|
||||
/// </summary>
|
||||
/// <param name="list">The list of failed results.</param>
|
||||
/// <returns>
|
||||
/// A successful result if the list is empty, the only Result in the list, or <see cref="AggregateError" />
|
||||
/// containing all results from the list.
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidOperationException"></exception>
|
||||
public static Result AggregateErrors(this List<Result> list)
|
||||
{
|
||||
return list.Count switch
|
||||
{
|
||||
0 => Result.FromSuccess(),
|
||||
1 => list[0],
|
||||
_ => new AggregateError(list.Cast<IResult>().ToArray())
|
||||
};
|
||||
}
|
||||
}
|
Reference in a new issue