Developer 02 82ce7996d1 feat: Erweiterung der ModelExtensions um zusätzliche Subscribe-Methoden
- Hinzugefügt: `SubscribeAsync` Methode für asynchrone Verarbeitung mit Abbruch-Token.
- Hinzugefügt: Überlastung von `Subscribe` Methode für sofortige Ausführung und wiederholte Ausführung mit Delay.
- Hinzugefügt: Methoden zur Erstellung von `Subscribe`-Aktionen mit Unterstützung für Abbruch-Token.
2024-07-30 11:12:31 +02:00

93 lines
3.5 KiB
C#

using DigitalData.Core.Legacy.Client;
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace WindreamHub.Legacy.Client.Models
{
public static class ModelExtensions
{
public static async Task<SimplifiedResponse<TData, TError>> Simplify<TData, TError>(this HttpResponseMessage message)
{
TData data = message.IsSuccessStatusCode ? await message.Json<TData>() : default;
TError err = !message.IsSuccessStatusCode ? await message.Json<TError>() : default;
return new SimplifiedResponse<TData, TError>(ok: message.IsSuccessStatusCode, status: message.StatusCode, data: data, error: err);
}
public static async Task SubscribeAsync<TData, TError>(this Task<SimplifiedResponse<TData, TError>> responseAsync, Action<TData> next, Action<TError> error, CancellationToken cancellationToken = default)
{
if (cancellationToken.IsCancellationRequested)
return;
var res = await responseAsync;
if (res.Ok)
next(res.Data);
else
error(res.Error);
}
public static void Subscribe<TData, TError>(this Task<SimplifiedResponse<TData, TError>> responseAsync, Action<TData> next, Action<TError> error, CancellationToken cancellationToken = default)
{
Task.Run(async () =>
{
if (cancellationToken.IsCancellationRequested)
return;
var res = await responseAsync;
if (res.Ok)
next(res.Data);
else
error?.Invoke(res.Error);
});
}
public static void Subscribe<TData, TError>(this Task<SimplifiedResponse<TData, TError>> responseAsync, int millisecondsDelay, Action<TData> next, Action<TError> error = null, CancellationToken cancellationToken = default)
{
Task.Run(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
var res = await responseAsync;
if (res.Ok)
next(res.Data);
else
error?.Invoke(res.Error);
await Task.Delay(millisecondsDelay, cancellationToken);
}
});
}
public static Func<Task> CreateSubscribeAsyncAction<TData, TError>(this Task<SimplifiedResponse<TData, TError>> responseAsync, Action<TData> next, Action<TError> error = null, CancellationToken cancellationToken = default)
{
return async () =>
{
if (cancellationToken.IsCancellationRequested)
return;
var res = await responseAsync;
if (res.Ok)
next(res.Data);
else
error?.Invoke(res.Error);
};
}
public static Action CreateSubscribeAction<TData, TError>(this Task<SimplifiedResponse<TData, TError>> responseAsync, Action<TData> next, Action<TError> error = null, CancellationToken cancellationToken = default)
{
return () => Task.Run(async () =>
{
if (cancellationToken.IsCancellationRequested)
return;
var res = await responseAsync;
if (res.Ok)
next(res.Data);
else
error?.Invoke(res.Error);
});
}
}
}