public static IAdvancedTypedBuilder OnSentAsync <TResult>(this IAdvancedTypedBuilder builder, Func <TypedSentContext <TResult>, Task> handler)
        {
            builder.WithConfiguration(s => s.WithResultType(typeof(TResult)));

            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncSentHandler(handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnResult <TResult>(this IAdvancedTypedBuilder builder, Action <TypedResultContext <TResult> > handler)
        {
            builder.WithConfiguration(s => s.WithResultType(typeof(TResult)));

            builder.WithConfiguration(s => s.HandlerRegister.WithResultHandler(handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnSendingWithContentAsync <TContent>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <TypedSendingContext <object, TContent>, Task> handler)
        {
            builder.WithConfiguration(s => s.WithContentType(typeof(TContent)));

            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncSendingHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnSent <TResult>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <TypedSentContext <TResult> > handler)
        {
            builder.WithConfiguration(s => s.WithResultType(typeof(TResult)));

            builder.WithConfiguration(s => s.HandlerRegister.WithSentHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnError <TError>(this IAdvancedTypedBuilder builder, Action <TypedErrorContext <TError> > handler)
        {
            builder.WithConfiguration(s => s.WithErrorType(typeof(TError)));

            builder.WithConfiguration(s => s.HandlerRegister.WithErrorHandler(handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnSendingWithContent <TContent>(this IAdvancedTypedBuilder builder, Action <TypedSendingContext <object, TContent> > handler)
        {
            builder.WithConfiguration(s => s.WithContentType(typeof(TContent)));

            builder.WithConfiguration(s => s.HandlerRegister.WithSendingHandler(handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnResultAsync <TResult>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <TypedResultContext <TResult>, Task> handler)
        {
            builder.WithConfiguration(s => s.WithResultType(typeof(TResult)));

            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncResultHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnErrorAsync <TError>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <TypedErrorContext <TError>, Task> handler)
        {
            builder.WithConfiguration(s => s.WithErrorType(typeof(TError)));

            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncErrorHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithAutoFollowConfiguration(this IAdvancedTypedBuilder builder, Action <FollowLocationHandler> configuration)

        {
            builder.WithConfiguration(s => s.HandlerRegister.WithConfiguration(configuration, false));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithRedirectConfiguration(this IAdvancedTypedBuilder builder, Action <RedirectHandler> configuration)

        {
            builder.WithConfiguration(s => s.HandlerRegister.WithConfiguration(configuration, false));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithOptionalHttpHandlerConfiguration <THandler>(this IAdvancedTypedBuilder builder, Action <THandler> configure)
            where THandler : class, ITypedHandler
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithConfiguration(configure, false));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithMediaType(this IAdvancedTypedBuilder builder, string mediaType)
        {
            if (mediaType == null)
            {
                return(builder);
            }

            // we need to set the media at the typed settings level so the media formatter can use it
            builder.WithConfiguration((ITypedBuilderSettings s) => s.MediaType = mediaType);

            // we need to set it at the raw http settings level so that it can set headers and whatnot
            builder.WithConfiguration((IHttpBuilderSettings s) => s.MediaType = mediaType);
            builder.WithAcceptHeaderValue(mediaType);

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheExpired(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <CacheExpiredContext> cacheHandler)

        {
            builder.WithConfiguration(s => s.HandlerRegister.WithExpiredHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithSuccessfulResponseValidator(this IAdvancedTypedBuilder builder, Func <HttpResponseMessage, bool> validator)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }

            builder.WithConfiguration((ITypedBuilderSettings s) => s.ResponseValidator.Add(new ResponseValidatorFunc(validator)));

            return(builder);
        }
        public static IAdvancedTypedBuilder WithMediaTypeFormatterConfiguration <TFormatter>(this IAdvancedTypedBuilder builder, Action <TFormatter> configure) where TFormatter : MediaTypeFormatter
        {
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            builder.WithConfiguration(s =>
            {
                var formatter = s.Formatter.MediaTypeFormatters.OfType <TFormatter>().FirstOrDefault();

                if (formatter != null)
                {
                    configure(formatter);
                }
            });

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheExpiringAsync(this IAdvancedTypedBuilder builder, Func <CacheExpiringContext, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncExpiringHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheExpiring(this IAdvancedTypedBuilder builder, Action <CacheExpiringContext> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithExpiringHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheStoreAsync <TResult>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <CacheStoreContext <TResult>, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncStoreHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheStore <TResult>(this IAdvancedTypedBuilder builder, Action <CacheStoreContext <TResult> > cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithStoreHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheStoreAsync(this IAdvancedTypedBuilder builder, Func <CacheStoreContext <object>, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncStoreHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheStore(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <CacheStoreContext <object> > cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithStoreHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnErrorAsync(this IAdvancedTypedBuilder builder, Func <TypedErrorContext <object>, Task> handler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncErrorHandler(handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheMiss <TResult>(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <CacheMissContext <TResult> > cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithMissHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheMissAsync(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <CacheMissContext <object>, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncMissHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheMiss(this IAdvancedTypedBuilder builder, Action <CacheMissContext <object> > cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithMissHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnExceptionAsync(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <TypedExceptionContext, Task> handler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncExceptionHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnException(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <TypedExceptionContext> handler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithExceptionHandler(priority, handler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheMissAsync <TResult>(this IAdvancedTypedBuilder builder, Func <CacheMissContext <TResult>, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncMissHandler(cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnCacheExpiredAsync(this IAdvancedTypedBuilder builder, HandlerPriority priority, Func <CacheExpiredContext, Task> cacheHandler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithAsyncExpiredHandler(priority, cacheHandler));

            return(builder);
        }
        public static IAdvancedTypedBuilder OnError(this IAdvancedTypedBuilder builder, HandlerPriority priority, Action <TypedErrorContext <object> > handler)
        {
            builder.WithConfiguration(s => s.HandlerRegister.WithErrorHandler(priority, handler));

            return(builder);
        }