// 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;
using fuchsia.url;

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

    /// URL of the package containing the driver. This is purely informational,
    /// used only to provide data for inspect.
    4: fuchsia.url.Url url;

    /// 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.
    5: fuchsia.data.Dictionary program;

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

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

    /// Exposed directory provided to the driver, for |node|.
    8: 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 runner that the driver has stopped.
///   2. To the driver host that the driver 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);
};
