// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.net.name;

using fuchsia.net;

/// Lookup operation errors.
type LookupError = strict enum {
    /// No result was found for this query.
    NOT_FOUND = 1;
    /// The lookup failed, but may succeed at a later time. For instance, the
    /// network or DNS server may be unreachable.
    TRANSIENT = 2;
    /// The lookup failed due to an invalid argument (for instance, the hostname
    /// was not encoded correctly, or was too long).
    INVALID_ARGS = 3;
    /// The lookup failed due to an internal error.
    INTERNAL_ERROR = 4;
};

/// Provides name and address resolution.
@discoverable
protocol Lookup {
    /// Lookup a list of IP addresses by hostname.
    ///
    /// If `hostname` is an Internationalized Domain Name, it must be encoded as
    /// per RFC 3490.
    LookupIp(struct {
        hostname fuchsia.net.Hostname;
        options @generated_name("LookupIpOptions") table {
            /// Include IPv4 results.
            ///
            /// If not set, interpreted as false.
            1: ipv4_lookup bool;
            /// Include IPv6 results.
            ///
            /// If not set, interpreted as false.
            2: ipv6_lookup bool;
            /// Sort addresses in order of preference.
            ///
            /// It true, Addresses are sorted according to destination address
            /// selection described in
            /// [RFC 6724 Section 6](https://tools.ietf.org/html/rfc6724#section-6).
            ///
            /// If not set, interpreted as false.
            3: sort_addresses bool;

            // TODO(https://fxbug.dev/21414): add a field here and in `LookupResult`
            // to support returning the canonical name.
        };
    }) -> (struct {
        result @generated_name("LookupResult") table {
            /// The IP addresses resulting from a lookup.
            ///
            /// If sorting was requested, `addresses` is sorted in order of
            /// preference, most preferred destination address first.
            1: addresses vector<fuchsia.net.IpAddress>:MAX;
        };
    }) error LookupError;
    /// Look up a hostname by IP address.
    LookupHostname(struct {
        addr fuchsia.net.IpAddress;
    }) -> (struct {
        hostname fuchsia.net.Hostname;
    }) error LookupError;
};
