// 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 offered by a component to one of its children, which
/// may have been offered by the component's containing realm, the component
/// itself, or one of its other children.
type Offer = flexible union {
    1: service OfferService;
    2: protocol OfferProtocol;
    3: directory OfferDirectory;
    4: storage OfferStorage;
    5: runner OfferRunner;
    6: resolver OfferResolver;
    @available(removed=14)
    7: event OfferEvent;
    8: event_stream OfferEventStream;
    @available(added=HEAD)
    9: dictionary OfferDictionary;
    @available(added=HEAD)
    10: config OfferConfiguration;
};

/// Describes the type of dependency implied by the capability.
type DependencyType = strict enum {
    /// A strong dependency which may be required by components that use it.
    STRONG = 1;
    /// A weak dependency which is allowed to form a cycle. Components that use
    /// a weak dependency must support the dependency being unavailable at
    /// arbitrary times.
    WEAK = 2;

    @available(deprecated=14, removed=15)
    WEAK_FOR_MIGRATION = 3;
};


/// Type used to create a mapping between 2 names. Used to rename service or component instances
/// in FIDL declarations.
type NameMapping = struct {
    /// Name used in the source instance.
    source_name name;

    /// Name used in the target instance.
    target_name name;
};

/// Describes the expected availability of the capability.
///
/// Some capabilities may not be present on all system configurations. In those
/// cases, the availability will be declared as `OPTIONAL` along the chains of
/// exposes/offers/uses, and the capability would be routed from `void` on
/// system configurations where it does not make sense to route or provide a
/// particular capability (e.g. graphical capabilities on a headless system).
type Availability = strict enum {
    /// The capability must be available. Failure to route the capability is an
    /// error.
    REQUIRED = 1;

    /// Inside a use declaration: the component can function if it fails to
    /// obtain the capability.
    ///
    /// Inside an offer/expose declaration: the capability may not be available
    /// in some system configurations. As a corollary, the target component must
    /// not have a required dependency on the capability.
    OPTIONAL = 2;

    /// If the target of the corresponding offer or expose declaration requires
    /// the capability, then the behavior is equivalent to required. If the
    /// target has an optional dependency on the capability, then the behavior
    /// is equivalent to optional. This is useful for container components that
    /// would like to change their routing availability based on ones inside.
    ///
    /// This value is not allowed inside a use declaration.
    SAME_AS_TARGET = 3;

    /// The source may omit the route completely without even having to route
    /// from `void`.
    ///
    /// [`TRANSITIONAL`] is used for soft transitions that introduce new
    /// capabilities.
    @available(added=9)
    TRANSITIONAL = 4;
};

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

    /// (Required) Name identifying the service being offered.
    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) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

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

    /// (Optional) The list of allowlisted instances to be offered. Instances
    /// of the service not in this list will not be accessible by the target
    /// component. If this is not set that means all instances from the source
    /// service are offered.
    5: source_instance_filter vector<string:MAX_NAME_LENGTH>:MAX;

    /// (Optional) The list of allowlisted instances to be offered, with
    /// renames.
    ///
    /// If this is set and nonempty, the set of instances in the target service
    /// will be restricted to the instances in this list, renaming `source_name`
    /// to `target_name`.
    ///
    /// If it is set and nonempty, `source_instance_filter` will further
    /// restrict the set of instances to those whose `target_name` appears in
    /// that list. There is generally no reason to set both, but we support it
    /// for compatibility.
    6: renamed_instances vector<NameMapping>:MAX;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    7: availability Availability;
};

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

    /// (Required) Name identifying the protocol being offered.
    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)
    7: source_dictionary dictionary_path;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

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

    /// (Required) The dependency type this offer represents. A component which
    /// receives a weak offer must support the offered capability being
    /// unavailable at any point.
    5: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    6: availability Availability;
};

/// Declares a directory offered by a component to one of its children, which
/// may have been offered by the component's containing realm, the component
/// itself, or one of its other children.
type OfferDirectory = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `self`, `child`, or `void`.
    /// If set to `void`, then the target must offer or use the capability with
    /// `OPTIONAL` or `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the directory being offered.
    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)
    9: source_dictionary dictionary_path;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

    /// (Required) The name by which the capability is being offered.
    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 offer instead of the
    /// root. Optional.
    6: subdir string:MAX_PATH_LENGTH;

    /// (Required) The dependency type this offer represents. A component which
    /// receives a weak offer must support the offered capability being
    /// unavailable at any point.
    7: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    8: availability Availability;
};

/// Declares a storage capability offered by a component to one of its children,
/// such as meta storage offered by the component's containing realm or cache
/// storage offered by the component itself.
type OfferStorage = table {
    /// (Required) The name of the storage capability being offered
    1: source_name name;

    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `self`, `child`, or `void`.
    /// If set to `void`, then the target must offer or use the capability with
    /// `OPTIONAL` or `TRANSITIONAL` availability.
    2: source Ref;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

    /// (Required) The name the storage capability is being offered as
    4: target_name name;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    5: availability Availability;
};

/// Declares a runner offered by a component to one of its children, which may
/// have been offered by the component's containing realm, the component itself,
/// or one of its other children.
type OfferRunner = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `self`, `child`, or `void`.
    /// If set to `void`, then the target must offer or use the capability with
    /// `OPTIONAL` or `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name of the runner being offered.
    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)
    5: source_dictionary dictionary_path;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

    /// (Required) Name under which the capability is being offered.
    4: target_name name;
};

/// Declares a resolver capability offered by a component to one of its children, which
/// may have been offered by the component's containing realm, the component itself,
/// or one of its other children.
type OfferResolver = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `self`, `child`, or `void`.
    /// If set to `void`, then the target must offer or use the capability with
    /// `OPTIONAL` or `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name of the resolver being offered.
    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)
    5: source_dictionary dictionary_path;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

    /// (Required) Name under which the capability is being offered.
    4: target_name name;
};

/// Declares an event offered by a component.
@available(removed=14)
type OfferEvent = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent` or `void`. If set to `void`, then the target
    /// must offer or use the capability with `optional` availability.
    1: source Ref;

    /// (Required) Name of the event being offered.
    2: source_name name;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

    /// (Required) Name under which the event is being offered.
    4: 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?)
    5: filter fuchsia.data.Dictionary;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    6: availability Availability;
};

/// Declares an event stream offered by a component.
type OfferEventStream = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `framework`, `child`, or `void`. If set to
    /// `void`, then the target must offer or use the capability with `OPTIONAL`
    /// or `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name of the event being offered.
    2: source_name name;

    /// (Optional) When an event is offered from framework, the scope is
    /// required and allows one to define the child (or array of children) which
    /// the event is about. When the event is offered 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 destination to which the event stream is offered.
    4: target Ref;

    /// (Required) Name under which the event stream is being offered.
    5: target_name name;

    /// (Optional) Filter for the event stream. Only present for DirectoryReady
    /// events and CapabilityRequested events
    @available(removed=14)
    6: filter fuchsia.data.Dictionary;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    7: availability Availability;
};

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

    /// (Required) Name identifying the dictionary being offered.
    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)
    7: source_dictionary dictionary_path;

    /// (Required) Reference to the target. Must be `child`, `collection`, or
    /// a dictionary `capability`.
    3: target Ref;

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

    /// (Required) The dependency type this offer represents. A component which
    /// receives a weak offer must support the offered capability being
    /// unavailable at any point.
    5: dependency_type DependencyType;

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    6: availability Availability;
};

/// Declares a configuration capability offered by a component to one of its children,
/// which may have been offered by the component's containing realm, the
/// component itself, or one of its other children.
@available(added=HEAD)
type OfferConfiguration = table {
    /// (Required) The provider of the capability relative to the component
    /// itself. Must be `parent`, `self`, `child`, or `void`.
    /// If set to `void`, then the target must offer or use the capability with
    /// `OPTIONAL` or `TRANSITIONAL` availability.
    1: source Ref;

    /// (Required) Name identifying the configuration being offered.
    2: source_name name;

    /// (Required) Reference to the target. Must be `child`, or `collection`.
    3: target Ref;

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

    /// (Optional, defaults to `REQUIRED`) The availability of this capability.
    /// If set to `required`, the target may use or offer the capability with
    /// either `required` or `optional` availability. If set to `optional`, the
    /// target must use or offer the capability with `optional` availability.
    /// The `same_as_target` value causes this offer's availability to match the
    /// availability set in the target.
    5: availability Availability;
};
