// Copyright 2018 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.sys2;

using fuchsia.data;

/// A component declaration.
///
/// This information is typically encoded in the component manifest (.cm file)
/// if it has one or may be generated at runtime by a component resolver for
/// those that don't.
type ComponentDecl = table {
    /// Information about the program to run when the component is executed.
    /// Omitted for non-executable components.
    1: program ProgramDecl;

    /// List of capabilities used by the component. These consist of
    /// capabilities offered to the component that are installed in its incoming
    /// namespace.
    ///
    /// The used capabilities must be unique and non-overlapping.
    2: uses vector<UseDecl>;

    /// List of capabilities exposed by the component. These consist of
    /// capabilities that are made visible to the parent. The parent
    /// may `offer` these capabilities to its children, but not `use` them.
    ///
    /// The exposed capabilities must be unique and non-overlapping.
    3: exposes vector<ExposeDecl>;

    /// List of capabilities offered to the component's children. These consist
    /// of capabilities that the given children may `use`, which may come from a
    /// child, the parent, or the component's own outgoing namespace.
    ///
    /// The offered capabilities must be unique and non-overlapping.
    4: offers vector<OfferDecl>;

    /// List of capabilities defined by the component.
    5: capabilities vector<CapabilityDecl>;

    /// The component's statically instantiated children. The children must have
    /// unique names.
    6: children vector<ChildDecl>;

    /// The component's collections. The collections must have unique names.
    7: collections vector<CollectionDecl>;

    /// List of environments created by this component.
    /// Environments are assigned to children and control aspects of a child component's
    /// runtime.
    8: environments vector<EnvironmentDecl>;

    /// Additional metadata about the component.
    9: facets fuchsia.data.Dictionary;

    /// The declaration of the component's configuration interface.
   10: config ConfigDecl;
};
