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

using fuchsia.component;
using fuchsia.component.runner;
using fuchsia.data;
using fuchsia.io;

/// Arguments for starting a driver.
resource table DriverStartArgs {
    /// Node that the driver is bound to.
    1: Node node;

    /// Offers provided to the driver, for |node|. These are names of FIDL
    /// protocols that can be accessed through |exposed_dir|.
    2: vector<fuchsia.component.name>:MAX_OFFER_COUNT offers;

    /// Symbols provided to the driver, for |node|. These come from the driver
    /// that added |node|, and are filtered to the symbols requested in the bind
    /// program.
    3: vector<NodeSymbol>:MAX_SYMBOL_COUNT symbols;

    /// Information about the driver to start. Currently, we support the
    /// following entries:
    ///   1. "binary": a string containing the package-relative path to the
    ///      driver binary.
    ///   2. "colocate" (optional): a string containing "true" or "false"
    ///      specifying whether the driver should be colocated in the same
    ///      driver host as the driver that added |node|. If not specified, the
    ///      driver will be launched in a new driver host.
    4: fuchsia.data.Dictionary program;

    /// Incoming namespace provided to the driver.
    5: vector<fuchsia.component.runner.ComponentNamespaceEntry>:fuchsia.component.runner.MAX_NAMESPACE_COUNT ns;

    /// Outgoing directory served by the driver.
    6: request<fuchsia.io.Directory> outgoing_dir;

    /// Exposed directory provided to the driver, for |node|.
    7: fuchsia.io.Directory exposed_dir;
};

/// Protocol through which a driver's lifecycle can be managed.
///
/// Closing the protocol's channel is used to signal:
///   1. To the driver manager that the driver has stopped.
///   2. To the driver that it should stop.
protocol Driver {
};

/// Protocol through which a driver host can be managed.
[Discoverable]
protocol DriverHost {
    /// Start a driver within a driver host.
    Start(DriverStartArgs start_args, request<Driver> driver);
};
