blob: f7605310460144b0739c237809a15a4430c41623 [file] [log] [blame]
// Copyright 2022 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;
/// Represents a bind rule condition.
type Condition = strict enum {
UNKNOWN = 0;
ACCEPT = 1;
REJECT = 2;
};
/// Represents a bind rule in a parent specification.
type BindRule = struct {
/// Property key.
key NodePropertyKey;
/// Condition for evaluating the property values in
/// the matching process. The values must be ACCEPT
/// or REJECT.
condition Condition;
/// A list of property values. Must not be empty. The property
/// values must be the same type.
values vector<NodePropertyValue>:MAX_PROPERTY_COUNT;
};
/// Specification for a node that parents the composite node created from the
/// composite node specification.
type ParentSpec = struct {
/// Parent's bind rules. Property keys must be unique. Must not be empty.
bind_rules vector<BindRule>:MAX_PROPERTY_COUNT;
/// Properties for matching against a composite driver's bind rules.
/// Keys must be unique.
properties vector<NodeProperty>:MAX_PROPERTY_COUNT;
};
/// Struct that represents a composite node specification.
type CompositeNodeSpec = table {
/// The composite node spec's name.
1: name string:MAX;
/// The nodes in the composite node spec. Must not be empty. The first node is
/// the primary node.
2: parents vector<ParentSpec>:MAX;
};
/// Error codes for the CompositeNodeManager protocol.
type CompositeNodeSpecError = flexible enum {
/// An argument of the composite node spec was not provided.
MISSING_ARGS = 1;
/// The given composite node spec's `nodes` is empty.
EMPTY_NODES = 2;
/// The `name` in the given composite node spec is a duplicate of an already
/// created composite node spec.
ALREADY_EXISTS = 3;
};
/// Protocol through which board drivers can create composite node specs.
///
/// Composite node specs are created at runtime to dynamically bridge the
/// static bind rules of a composite driver with the dynamic bind properties
/// of nodes in the system so that the driver bind rules are more generic and reusable.
@discoverable
open protocol CompositeNodeManager {
/// Adds the given composite node specification to the driver framework.
flexible AddSpec(CompositeNodeSpec) -> () error CompositeNodeSpecError;
};