// 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.
table ComponentDecl {
    /// Information about the program to run when the component is executed.
    ///
    /// The component manager provides the contents of this dictionary to the
    /// component runner when executing the program. Each component runner can
    /// freely define the contents of this dictionary as needed.
    ///
    /// The system's default runner understands the following entries:
    ///
    /// - "binary": string
    ///   The path of the executable relative to the root of the package.
    ///   Typically an ELF binary.
    ///
    /// - "args": vector of strings
    ///   The command-line arguments to provide to the executable at runtime.
    ///
    /// - "env": dictionary of strings
    ///   The environment variables to provide to the executable at runtime.
    ///
    /// Other runners may define different entries.
    1: fuchsia.data.Dictionary program;

    /// 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: vector<UseDecl> uses;

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

    /// 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 containing realm, or the component's own outgoing namespace.
    ///
    /// The offered capabilities must be unique and non-overlapping.
    4: vector<OfferDecl> offers;

    /// Additional metadata about the component.
    5: Object facets;

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

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

    /// List of storage capabilities created by this component.
    /// Storage capabilities can be offered to children.
    8: vector<StorageDecl> storage;

    /// List of runner capabilities created by this component.
    /// Runner capabilities can be exposed to the parent's realm or offered to children.
    9: vector<RunnerDecl> runners;

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

    /// List of resolver capabilities created by this component.
    ///
    /// A component can:
    ///
    /// - "expose" a resolver capability to its realm,
    /// - "offer" a resolver capability to its children,
    /// - register a resolver in an environment.
    ///
    /// A component cannot "use" a resolver capability directly. Component manager uses
    /// a resolver capability on behalf of a component when that component's environment
    /// contains the resolver capability.
    11: vector<ResolverDecl> resolvers;
};
