CancellationHelper
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace System.ClientModel.Internal
{
    [System.Runtime.CompilerServices.NullableContext(2)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal static class CancellationHelper
    {
        [System.Runtime.CompilerServices.Nullable(1)]
        private static readonly string s_cancellationMessage = new OperationCanceledException().Message;
        [System.Runtime.CompilerServices.NullableContext(1)]
        internal static bool ShouldWrapInOperationCanceledException(Exception exception, CancellationToken cancellationToken)
        {
            if (!(exception is OperationCanceledException))
                return cancellationToken.IsCancellationRequested;
            return false;
        }
        [return: System.Runtime.CompilerServices.Nullable(1)]
        internal static Exception CreateOperationCanceledException(Exception innerException, CancellationToken cancellationToken, string message = null)
        {
            return new TaskCanceledException(message ?? s_cancellationMessage, innerException);
        }
        private static void ThrowOperationCanceledException(Exception innerException, CancellationToken cancellationToken)
        {
            throw CreateOperationCanceledException(innerException, cancellationToken, null);
        }
        internal static void ThrowIfCancellationRequested(CancellationToken cancellationToken, Exception innerException = null)
        {
            if (cancellationToken.IsCancellationRequested)
                ThrowOperationCanceledException(innerException, cancellationToken);
        }
        internal static void ThrowIfCancellationRequestedOrTimeout(CancellationToken messageToken, CancellationToken timeoutToken, Exception innerException, TimeSpan timeout)
        {
            ThrowIfCancellationRequested(messageToken, innerException);
            if (timeoutToken.IsCancellationRequested)
                throw CreateOperationCanceledException(innerException, timeoutToken, $"""{timeout:""}""");
        }
    }
}