// 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.pkg;
using zx;

/// Protocol for registering ephemeral driver packages.
@discoverable
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_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.
    ///     * `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.
    ///     * `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.
    Register(struct {
        package_url fuchsia.pkg.PackageUrl;
    }) -> (struct {}) error zx.status;
};
