File: DnsResolverOptionsValidator.cs
Web Access
Project: src\src\Libraries\Microsoft.Extensions.ServiceDiscovery.Dns\Microsoft.Extensions.ServiceDiscovery.Dns.csproj (Microsoft.Extensions.ServiceDiscovery.Dns)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Extensions.Options;
 
namespace Microsoft.Extensions.ServiceDiscovery.Dns;
 
internal sealed class DnsResolverOptionsValidator : IValidateOptions<DnsResolverOptions>
{
    // CancellationTokenSource.CancelAfter has a maximum timeout of Int32.MaxValue milliseconds.
    private static readonly TimeSpan s_maxTimeout = TimeSpan.FromMilliseconds(int.MaxValue);
 
    public ValidateOptionsResult Validate(string? name, DnsResolverOptions options)
    {
        if (options.Servers is null)
        {
            return ValidateOptionsResult.Fail($"{nameof(options.Servers)} must not be null.");
        }
 
        if (options.MaxAttempts < 1)
        {
            return ValidateOptionsResult.Fail($"{nameof(options.MaxAttempts)} must be one or greater.");
        }
 
        if (options.Timeout != Timeout.InfiniteTimeSpan)
        {
            if (options.Timeout <= TimeSpan.Zero)
            {
                return ValidateOptionsResult.Fail($"{nameof(options.Timeout)} must not be negative or zero.");
            }
 
            if (options.Timeout > s_maxTimeout)
            {
                return ValidateOptionsResult.Fail($"{nameof(options.Timeout)} must not be greater than {s_maxTimeout.TotalMilliseconds} milliseconds.");
            }
        }
 
        return ValidateOptionsResult.Success;
    }
}