// 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.index;

using fuchsia.driver.development;
using fuchsia.url;
using zx;

/// Protocol for driver development APIs for the driver index.
/// This interface should only be used for development and disabled in release builds.
/// This protocol is internal to the driver framework and should not be used directly by users.
/// Users should go through the `fuchsia.driver.development/Manager` protocol instead.
@discoverable
closed protocol DevelopmentManager {
    /// Returns a list of all drivers that are known to the system.
    /// If a |driver_filter| is provided, the returned list will be filtered to
    /// only include drivers specified in the filter.
    ///
    /// |iterator| is closed with following epitaphs on error:
    /// ZX_ERR_NOT_FOUND indicates that there is no driver matching the given path for at least
    /// one driver in |driver_filter|.
    /// ZX_ERR_BUFFER_TOO_SMALL indicates that the driver's bind program is longer than the
    /// maximum number of instructions (BIND_PROGRAM_INSTRUCTIONS_MAX).
    strict GetDriverInfo(resource struct {
        driver_filter vector<string:MAX>:MAX;
        iterator server_end:fuchsia.driver.development.DriverInfoIterator;
    });

    /// Returns a list of all composite node specs that are known to the system.
    /// If a |name_filter| is provided, the returned list will only include 1 spec,
    /// the one with that exact name.
    ///
    /// |iterator| is closed with following epitaphs on error:
    /// ZX_ERR_NOT_FOUND indicates that there are no specs or if a |name_filter| is provided,
    /// that there are no specs with that name.
    strict GetCompositeNodeSpecs(resource struct {
        name_filter string:<MAX, optional>;
        iterator server_end:fuchsia.driver.development.CompositeNodeSpecIterator;
    });

    /// Disables the driver with the given driver component url.
    /// Disabled drivers will not be considered for matching to nodes.
    /// If a |package_hash| is provided, only that specific version of the driver
    /// package will be disabled. Otherwise this applies to all existing versions
    /// of a driver with the given url.
    /// Returns an error ZX_ERR_NOT_FOUND if no drivers were affected.
    strict DisableDriver(struct {
        driver_url fuchsia.url.Url;
        package_hash string:<fuchsia.driver.development.HASH_LENGTH, optional>;
    }) -> () error zx.Status;

    /// Enables the driver with the given driver component url.
    /// This is only meant to revert a |DisableDriver| action.
    /// Returns an error ZX_ERR_NOT_FOUND if no drivers were affected.
    strict EnableDriver(struct {
        driver_url fuchsia.url.Url;
        package_hash string:<fuchsia.driver.development.HASH_LENGTH, optional>;
    }) -> () error zx.Status;
};
