Expose client extensions

This commit is contained in:
Oliver Booth 2022-11-29 15:15:15 +00:00
parent 55512d6c8d
commit 3e25e3cd11
No known key found for this signature in database
GPG Key ID: 32A00B35503AF634
1 changed files with 80 additions and 0 deletions

View File

@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Reflection;
using VpSharp.ClientExtensions;
@ -8,6 +9,15 @@ public sealed partial class VirtualParadiseClient
{
private readonly List<VirtualParadiseClientExtension> _extensions = new();
/// <summary>
/// Gets a read-only view of the extensions currently added to this client.
/// </summary>
/// <value>A read-only view of the extensions.</value>
public IReadOnlyList<VirtualParadiseClientExtension> Extensions
{
get => _extensions.AsReadOnly();
}
/// <summary>
/// Adds an extension to this client.
/// </summary>
@ -65,4 +75,74 @@ public sealed partial class VirtualParadiseClient
_extensions.Add(extension);
return extension;
}
/// <summary>
/// Gets the extension whose type matches a specified type.
/// </summary>
/// <param name="type">The type of the extension to get.</param>
/// <returns>The extension instance whose type matches <paramref name="type" />.</returns>
/// <exception cref="InvalidOperationException">No extension with the specified type is added to this client.</exception>
public VirtualParadiseClientExtension GetExtension(Type type)
{
ArgumentNullException.ThrowIfNull(type);
VirtualParadiseClientExtension? result = _extensions.Find(e => e.GetType() == type);
if (result is null)
{
throw new InvalidOperationException($"No extension with the type {type} is added to this client.");
}
return result;
}
/// <summary>
/// Gets the extension whose type matches a specified type.
/// </summary>
/// <typeparam name="T">The type of the extension to get.</typeparam>
/// <returns>The extension instance whose type matches <typeparamref name="T" />.</returns>
/// <exception cref="InvalidOperationException">No extension with the specified type is added to this client.</exception>
public T GetExtension<T>() where T : VirtualParadiseClientExtension
{
var result = _extensions.Find(e => e.GetType() == typeof(T)) as T;
if (result is null)
{
throw new InvalidOperationException($"No extension with the type {typeof(T)} is added to this client.");
}
return result;
}
/// <summary>
/// Attempts to get the extension whose type matches a specified type.
/// </summary>
/// <param name="type">The type of the extension to get.</param>
/// <param name="extension">
/// When this method returns, contains the extension instance whose type matches <paramref name="type" />, or
/// <see langword="null" /> if no such extension exists.
/// </param>
/// <returns><see langword="true" /> if a matching extension was found; otherwise, <see langword="false" />.</returns>
/// <exception cref="InvalidOperationException">No extension with the specified type is added to this client.</exception>
public bool TryGetExtension(Type type, [NotNullWhen(true)] out VirtualParadiseClientExtension? extension)
{
ArgumentNullException.ThrowIfNull(type);
extension = _extensions.Find(e => e.GetType() == type);
return extension is not null;
}
/// <summary>
/// Attempts to get the extension whose type matches a specified type.
/// </summary>
/// <typeparam name="T">The type of the extension to get.</typeparam>
/// <param name="extension">
/// When this method returns, contains the extension instance whose type matches <paramref name="type" />, or
/// <see langword="null" /> if no such extension exists.
/// </param>
/// <returns><see langword="true" /> if a matching extension was found; otherwise, <see langword="false" />.</returns>
/// <exception cref="InvalidOperationException">No extension with the specified type is added to this client.</exception>
public bool TryGetExtension<T>([NotNullWhen(true)] out T? extension) where T : VirtualParadiseClientExtension
{
extension = _extensions.Find(e => e.GetType() == typeof(T)) as T;
return extension is not null;
}
}