// 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.data;
using fuchsia.io;

/// Declares a capability used by a component, which was offered to it.
type Use = flexible union {
    1: service UseService;
    2: protocol UseProtocol;
    3: directory UseDirectory;
    4: storage UseStorage;
    @available(removed=14)
    5: event UseEvent;
    @available(removed=14)
    6: event_stream_deprecated UseEventStreamDeprecated;
    7: event_stream UseEventStream;
    @available(added=HEAD)
    8: runner UseRunner;
    @available(added=HEAD)
    9: config UseConfiguration;
};

/// Declares a service used by a component, which was offered to it.
///
/// To learn more about services, see:
/// https://fuchsia.dev/fuchsia-src/glossary#service
type UseService = table {
    /// (Required) The provider of the protocol relative to the component
    /// itself. Must be `parent`, `framework`, `self`, or `child`.
    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 dictionary_path;

    /// (Required) The path where the capability should be installed in the
    /// component's namespace.
    ///
    /// Must be an absolute path starting with /.
    3: target_path string:MAX_PATH_LENGTH;

    /// (Required) The dependency type this use represents.
    ///
    /// A component which offers a capability to a child from itself and uses a
    /// capability from the same child, must mark the dependency as `weak`.  A
    /// `weak` dependency implies that the capability may become unavailable at
    /// any point. Taking a strong dependency on a child's capability will
    /// cause this the child to shut down before its parent. When using a weak
    /// dependency, the parent shuts down before the child.
    4: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    5: availability Availability;
};

/// Declares a protocol used by a component, which was offered to it.
///
/// A protocol is a service with a single instance, provided by a single FIDL
/// protocol.
type UseProtocol = table {
    /// (Required) The provider of the protocol relative to the component
    /// itself. Must be `parent`, `framework`, `debug`, `capability` or `child`.
    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 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 dictionary_path;

    /// (Required) The path where the capability should be installed in the component's
    /// namespace.
    ///
    /// Must be an absolute path starting with /.
    3: target_path string:MAX_PATH_LENGTH;

    /// (Required) The dependency type this use represents.
    ///
    /// A component which offers a capability to a child from itself and uses a
    /// capability from the same child, must mark the dependency as `weak`.  A
    /// `weak` dependency implies that the capability may become unavailable at
    /// any point. Taking a strong dependency on a child's capability will
    /// cause this the child to shut down before its parent. When using a weak
    /// dependency, the parent shuts down before the child.
    4: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    5: availability Availability;
};

/// Declares a directory used by a component, which was offered to it.
type UseDirectory = table {
    /// (Required) The provider of the directory relative to the component
    /// itself. Must be `parent`, `framework`,  or `child`.
    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 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)
    8: source_dictionary dictionary_path;

    /// (Required) The path where the capability should be installed in the
    /// component's namespace.
    ///
    /// Must be an absolute path starting with /.
    3: target_path string:MAX_PATH_LENGTH;

    /// (Required) The rights required by the component to use this directory.
    4: rights fuchsia.io.Rights;

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

    /// (Required) The dependency type this use represents.
    ///
    /// A component which offers a capability to a child from itself and uses a
    /// capability from the same child, must mark the dependency as `weak`.  A
    /// `weak` dependency implies that the capability may become unavailable at
    /// any point. Taking a strong dependency on a child's capability will
    /// cause this the child to shut down before its parent. When using a weak
    /// dependency, the parent shuts down before the child.
    6: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    7: availability Availability;
};

/// Declares storage used by a component, which was offered to it.
type UseStorage = table {
    /// (Required) Name identifying the storage, by which it was presented to
    /// this component.
    1: source_name name;

    /// (Required) The path where the capability should be installed in the
    /// component's namespace.
    ///
    /// Must be an absolute path starting with /.
    2: target_path string:MAX_PATH_LENGTH;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    3: availability Availability;
};

/// Declares an event used by a component, which was offered to it.
@available(removed=14)
type UseEvent = table {
    /// (Required) The provider of the event. Must be `realm` or `framework`. If
    /// the availability is set to `optional`, then this must be set to
    /// `parent`.
    1: source Ref;

    /// (Required) Name identifying the event which was presented to this
    /// component.
    2: source_name name;

    /// (Required) The name which the component will use to refer to this event.
    3: target_name name;

    /// (Optional) Filter for the event. The structure of the filter depends on
    /// the event type. May be absent for some events. (TODO: which ones?)
    4: filter fuchsia.data.Dictionary;

    /// (Required) The dependency type this use represents.
    ///
    /// A component which offers a capability to a child from itself and uses a
    /// capability from the same child, must mark the dependency as `weak`.  A
    /// `weak` dependency implies that the capability may become unavailable at
    /// any point. Taking a strong dependency on a child's capability will
    /// cause this the child to shut down before its parent. When using a weak
    /// dependency, the parent shuts down before the child.
    5: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    6: availability Availability;
};

/// Declares a static EventStream used by a component.
@available(removed=14)
type UseEventStreamDeprecated = table {
    /// (Required) The name of the event stream.
    1: name name;

    /// (Required) The set of events to which this EventStream is subscribed.
    /// Note: This vector must be non-empty.
    2: subscriptions vector<EventSubscription>:MAX_NUM_EVENT_STREAM_SUBSCRIPTIONS;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    3: availability Availability;
};

/// Declares an EventStream used by a component.
type UseEventStream = table {
    /// (Required) The names of the event streams.
    1: source_name name;

    /// (Required) The provider of the event. Must be `parent`, `framework`, or `child`.
    2: source Ref;

    /// (Optional) When an event is used from framework, the scope is required
    /// to specify the child (or array of children) which the event will be
    /// about. When the event is used from parent, the scope can be used to
    /// downscope the event to a certain child scope, otherwise the event will
    /// carry the scope coming from the parent.
    3: scope vector<Ref>:MAX;

    /// (Required) The path where the capability should be installed in the
    /// component's namespace. Must be an absolute path starting with /.
    4: target_path name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    5: availability Availability;

    /// (Optional) Filter for the event stream. The structure of the filter
    /// depends on the event stream type. Only supported for the
    /// `CapabilityRequested` event type.
    @available(added=9)
    6: filter fuchsia.data.Dictionary;
};

/// Declares runner used by a component.
@available(added=HEAD)
type UseRunner = table {
    /// (Required) The provider of the runner relative to the component.
    /// Must be `parent`, `child`, `framework`, or `environment`.
    1: source Ref;

    /// (Required) Name identifying the runner, 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)
    3: source_dictionary dictionary_path;
};

@available(added=HEAD)
type UseConfiguration = table {
    /// (Required) The provider of the configuration relative to the component
    /// itself. Must be `parent`, `self`, `child`.
    1: source Ref;

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

    /// (Required) The name that the component sees for this configuration.
    /// This must match a key in the 'config' schema for this component. The
    /// matching config field's type must match this configuration type.
    3: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the component is likely to malfunction if this
    /// capability is not provided. If set to `optional`, the component can
    /// handle the capability's absence.
    4: availability Availability;

    /// (Required) The type of this config value. If `target_name` matches a
    /// key in the `config` schema, then this type must match that type.
    5: type ConfigType;
};
