// Copyright 2018 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.sys2;

using zx;

/// An interface for resolving a URL to a component.
///
/// This interface is implemented by components that provide support
/// for loading components with a particular URL scheme.   For example,
/// the Fuchsia package component resolver exposes a service with this
/// interface to resolve component URLs using the "fuchsia-pkg://" scheme.
///
/// To use a resolver to resolve URLs within your realm, register it
/// in your realm's manifest.  (TODO: explain in more detail)
///
/// Note: The component manager is the only intended direct client of this
/// interface.
[Discoverable]
protocol ComponentResolver {
    /// Resolves a component with the given URL.
    ///
    /// `component_url` is the unescaped URL of the component to resolve.
    ///
    /// If successful, returns `ZX_OK` and information about the component
    /// that was resolved.
    ///
    /// On failure, returns null `info` and...
    /// - `ZX_ERR_INVALID_ARGS`: The component's URL was malformed.
    /// - `ZX_ERR_NOT_FOUND`: The component does not exist.
    /// - `ZX_ERR_UNAVAILABLE`: The resolver was unable to retrieve or parse
    ///   the component's resources.
    Resolve(string component_url)
        -> (zx.status status, Component component);
};
