// Copyright 2020 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.driver.registrar;

using fuchsia.url;
using zx;

/// Protocol for registering ephemeral driver packages.
@discoverable
open protocol DriverRegistrar {
    /// Informs the driver framework of an ephemeral driver. The metadata will
    /// be cached by the driver index to be used in future matching operations.
    /// * error a zx_status value indicating failure. One of the following:
    ///     * `ZX_ERR_PROTOCOL_NOT_SUPPORTED` if the ephermeral driver config
    ///       `enable_ephemeral_drivers` is not enabled.
    ///     * `ZX_ERR_ACCESS_DENIED` if the device does not have permissions
    ///       to fetch the package.
    ///     * `ZX_ERR_ALREADY_EXISTS` if the driver component being registered
    ///       already exists in the boot or base drivers list.
    ///     * `ZX_ERR_NOT_FOUND` if the package does not exist or it is missing
    ///        a manifest or /pkg directory.
    ///     * `ZX_ERR_IO` if there is some other unspecified error during I/O.
    ///     * `ZX_ERR_ADDRESS_UNREACHABLE` if the package resolver does not
    ///       know about the repo or the url cannot be parsed.
    ///     * `ZX_ERR_INVALID_ARGS` if the component decl cannot be parsed.
    ///     * `ZX_ERR_NO_SPACE` if the device is out of space.
    ///     * `ZX_ERR_UNAVAILABLE` if the package resolver could not be reached.
    ///     * `ZX_ERR_INTERNAL` if an unspecified error was encountered.
    flexible Register(struct {
        driver_url fuchsia.url.Url;
    }) -> () error zx.Status;
};
