// Copyright 2023 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.url;

/// The type of Fuchsia package that a driver component is inside of.
/// More details about the various package categories are available at:
/// https://fuchsia.dev/fuchsia-src/concepts/packages/package#types_of_packages
@available(added=16)
type DriverPackageType = flexible enum : uint8 {
    /// BOOT packages are inside the Zircon boot image.
    BOOT = 0;
    /// BASE packages are included in the Fuchsia build as static local packages.
    BASE = 1;
    /// CACHED packages are BASE packages that can be updated during a resolve if a full package
    /// resolver is available.
    CACHED = 2;
    /// UNIVERSE packages get onto the device only when resolved by the full package resolver.
    UNIVERSE = 3;
};

/// Device categories as provided in the driver's component manifest.
@available(added=16)
type DeviceCategory = table {
    1: category string:MAX;
    2: subcategory string:MAX;
};

/// General information for a driver, used with both composite and normal drivers.
@available(added=16)
type DriverInfo = table {
    /// URL of the driver component.
    1: url string:fuchsia.url.MAX_URL_LENGTH;

    /// Name of the driver, taken from the first field of the `ZIRCON_DRIVER`
    /// macro in the driver.
    2: name string:MAX;

    /// If this is true then the driver should be colocated in its parent's DriverHost.
    3: colocate bool;

    /// The type of package this driver is in.
    4: package_type DriverPackageType;

    /// If this is true then the driver is a fallback driver. Fallback drivers have a
    /// lesser priority for binding, so they will only be chosen for binding if there
    /// is no non-fallback driver that has matched.
    5: is_fallback bool;

    /// Device categories
    6: device_categories vector<DeviceCategory>:MAX;

    /// Bind rules which declare set of constraints to evaluate in order to
    /// determine whether the driver indexer should bind this driver to a
    /// device.
    7: bind_rules_bytecode vector<uint8>:MAX;

    /// The version of the driver framework that this driver is using.
    /// Supported values are 1 (DFv1) and 2 (DFv2).
    /// If not provided, 1 is the assumed version.
    8: driver_framework_version uint8;

    /// Whether the driver is disabled. If true, this driver is not chosen to bind to nodes.
    @available(added=17)
    9: is_disabled bool;

    // TODO(b/303084353): Add the merkle root when the type is available in the sdk.
};

/// Information for a composite driver.
@available(added=16)
type CompositeDriverInfo = table {
    /// The name of the composite as specified in the driver's composite bind rules.
    1: composite_name string:MAX;

    /// General information for the driver.
    2: driver_info DriverInfo;
};

/// Information for a composite driver that has matched with a composite.
@available(added=16)
type CompositeDriverMatch = table {
    /// Information for the composite driver that has matched.
    1: composite_driver CompositeDriverInfo;

    /// A list of all the parent names, ordered by index.
    /// These names come from the node definitions in the driver's composite bind rules.
    2: parent_names vector<string:MAX>:MAX;

    /// The primary node index. Identified by the primary node in the driver's
    /// composite bind rules.
    3: primary_parent_index uint32;
};

/// Information for a composite that is defined by a composite node spec.
@available(added=16)
type CompositeInfo = table {
    /// The spec information that this composite node spec was created with.
    1: spec CompositeNodeSpec;

    /// Information for the node spec that is available only when a driver
    /// has matched to the properties in this spec's parents.
    2: matched_driver CompositeDriverMatch;
};

/// A parent to a composite that is defined by a composite node spec.
@available(added=16)
type CompositeParent = table {
    /// Information about the composite that this is a parent of.
    1: composite CompositeInfo;

    /// The index of this parent in the spec's parents.
    2: index uint32;
};
