// Copyright 2021 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.component.decl;

using fuchsia.io;

/// Declares a capability exposed to either a component's containing realm or to
/// the framework. For example, a legacy service exposed by the component at
/// runtime.
type Expose = flexible union {
    1: service ExposeService;
    2: protocol ExposeProtocol;
    3: directory ExposeDirectory;
    4: runner ExposeRunner;
    5: resolver ExposeResolver;
    @available(removed=13)
    6: event_stream ExposeEventStream;
    @available(added=HEAD)
    7: dictionary ExposeDictionary;
    @available(added=HEAD)
    8: config ExposeConfiguration;
};

/// Declares a service exposed to a component's containing realm, such as a
/// service exposed by the component or one of its children at runtime.
///
/// To learn more about services, see:
/// https://fuchsia.dev/fuchsia-src/glossary#service
type ExposeService = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`, or `void`. If set to `void`, then the
    /// target must expose, offer, or use the capability with `OPTIONAL` or
    /// `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the service, by which it was presented to
    /// this component.
    2: source_name name;

    /// (Optional) Path in a dictionary provided by `source` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside this
    /// dictionary.
    @available(added=HEAD)
    6: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the service is exposed: either the
    /// component's realm or the framework.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11)
    5: availability Availability;
};

/// Declares a protocol exposed to a component's containing realm, such as
/// a protocol exposed by the component or one of its children at runtime.
///
/// To learn more about protocols, see:
/// https://fuchsia.dev/fuchsia-src/glossary#protocol
type ExposeProtocol = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`, or `void`. If set to `void`, then the
    /// target must expose, offer, or use the capability with `OPTIONAL` or
    /// `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the protocol, by which it was presented to
    /// this component.
    2: source_name name;

    /// (Optional) Path in a dictionary offered by `ref` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside a
    /// dictionary. The name of the top-level dictionary is given by the first path
    /// segment of `source_dictionary`, and `source` is expected to route a
    /// dictionary capability with this name. The rest of the path (possibly empty)
    /// represents the path to a dictionary nested in the top-level dictionary which
    /// is expected to contain `source_name`.
    @available(added=HEAD)
    6: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the protocol is exposed: either the
    /// component's realm or the framework.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11)
    5: availability Availability;
};

/// Declares a directory exposed to a component's containing realm, such as a
/// directory exposed by the component or one of its children at runtime.
type ExposeDirectory = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`, or `void`. If set to `void`, then the
    /// target must expose, offer, or use the capability with `OPTIONAL` or
    /// `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the directory, by which it was presented to
    /// this component.
    2: source_name name;

    /// (Optional) Path in a dictionary offered by `ref` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside a
    /// dictionary. The name of the top-level dictionary is given by the first path
    /// segment of `source_dictionary`, and `source` is expected to route a
    /// dictionary capability with this name. The rest of the path (possibly empty)
    /// represents the path to a dictionary nested in the top-level dictionary which
    /// is expected to contain `source_name`.
    @available(added=HEAD)
    8: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the directory is exposed: either the
    /// component's realm or the framework.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional) The maximum rights that can be set by a component using this
    /// directory. If unset, the rights are inherited from `source`.
    5: rights fuchsia.io.Rights;

    /// (Optional) The subdirectory of this directory to expose instead of the
    /// root.
    6: subdir string:MAX_PATH_LENGTH;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11)
    7: availability Availability;
};

/// Declares a runner exposed to a component's containing realm, such as a
/// runner exposed by the component or one of its children at runtime.
type ExposeRunner = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`.
    1: source Ref;

    /// (Required) The name of the runner, by which it was presented to this
    /// component.
    2: source_name name;

    /// (Optional) Path in a dictionary offered by `ref` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside a
    /// dictionary. The name of the top-level dictionary is given by the first path
    /// segment of `source_dictionary`, and `source` is expected to route a
    /// dictionary capability with this name. The rest of the path (possibly empty)
    /// represents the path to a dictionary nested in the top-level dictionary which
    /// is expected to contain `source_name`.
    @available(added=HEAD)
    6: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the runner is exposed: either the
    /// component's realm or the framework.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11, removed=12)
    5: availability Availability;
};

/// Declares a resolver exposed to a component's containing realm, such as a
/// resolver exposed by the component or one of its children at runtime.
type ExposeResolver = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`.
    1: source Ref;

    /// (Required) The name of the resolver, by which it was presented to this
    /// component.
    2: source_name name;

    /// (Optional) Path in a dictionary offered by `ref` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside a
    /// dictionary. The name of the top-level dictionary is given by the first path
    /// segment of `source_dictionary`, and `source` is expected to route a
    /// dictionary capability with this name. The rest of the path (possibly empty)
    /// represents the path to a dictionary nested in the top-level dictionary which
    /// is expected to contain `source_name`.
    @available(added=HEAD)
    6: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the resolver is exposed
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11, removed=12)
    5: availability Availability;
};

/// Declares an event stream exposed to a component's containing realm, such as
/// an event stream exposed by the component or one of its children at runtime.
@available(removed=13)
type ExposeEventStream = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `child`, or `framework`.
    1: source Ref;

    /// (Required) The name of the event stream
    2: source_name name;

    /// (Required) When an event is exposed from framework, the scope is
    /// required and allows one to define the child (or array of children) which
    /// the event is about.
    3: scope vector<Ref>:MAX;

    /// (Required) The destination to which the event stream is exposed.
    4: target Ref;

    /// (Required) The name by which the capability is being exposed.
    5: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    @available(added=11)
    6: availability Availability;
};

/// Declares a dictionary exposed to a component's containing realm, such as
/// a dictionary exposed by the component or one of its children at runtime.
///
/// To learn more about dictionarys, see:
/// https://fuchsia.dev/fuchsia-src/glossary#dictionary
@available(added=HEAD)
type ExposeDictionary = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`, or `void`. If set to `void`, then the
    /// target must expose, offer, or use the capability with `OPTIONAL` or
    /// `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the dictionary, by which it was presented to
    /// this component.
    2: source_name name;

    /// (Optional) Path in a dictionary offered by `ref` which contains `source_name`.
    /// If this field is absent, `source_name` identifies a capability directly routed
    /// by `source`. If set, `source_name` identifies a capability nested inside a
    /// dictionary. The name of the top-level dictionary is given by the first path
    /// segment of `source_dictionary`, and `source` is expected to route a
    /// dictionary capability with this name. The rest of the path (possibly empty)
    /// represents the path to a dictionary nested in the top-level dictionary which
    /// is expected to contain `source_name`.
    @available(added=HEAD)
    6: source_dictionary string:MAX_PATH_LENGTH;

    /// (Required) The destination to which the dictionary is exposed: either the
    /// component's realm or the framework.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    5: availability Availability;
};

/// Declares a configuration capability exposed to a component's containing realm, such as
/// a capability exposed by the component or one of its children at runtime.
@available(added=HEAD)
type ExposeConfiguration = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `self` or `child`, or `void`. If set to `void`, then the
    /// target must expose, offer, or use the capability with `OPTIONAL` or
    /// `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the configuration, by which it was presented to
    /// this component.
    2: source_name name;

    /// (Required) The destination to which the capability is exposed.
    3: target Ref;

    /// (Required) The name by which the capability is being exposed.
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// See [`Availability`].
    5: availability Availability;
};
