// Copyright 2017 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.modular;

using fuchsia.mem;

/// The Intent struct is a runtime descriptor for an abstract action to be initiated
/// in Fuchsia. For details please see docs/intent.md.
type Intent = resource struct {
    /// The name of the action represented by this Intent.
    ///
    /// This is nullable for backwards compatibility.
    // TODO(fxbug.dev/15983): Make action non-nullable.
    action string:<MAX, optional>;

    /// An explicit handler for the Intent. Specified as the component URL of the
    /// module.
    handler string:<MAX, optional>;

    /// NON-FUNCTIONAL: `parameters` is no longer supported but must remain for ABI compatibility.
    parameters vector<IntentParameter>:<MAX, optional>;
};

/// NON-FUNCTIONAL: `IntentParameter` is no longer supported but must remain for ABI compatibility.
/// A struct representing a parameter that is passed to the handler of an Intent's
/// Action.
type IntentParameter = resource struct {
    /// The name of the parameter. The handler (i.e. selected mod) will be provided
    /// with the data for this parameter under a link called `name`.
    name string:<MAX, optional>;

    /// The data that will be passed to the intent handler.
    data IntentParameterData;
};

/// NON-FUNCTIONAL: `IntentParameterData` is no longer supported but must remain defined for
/// `IntentParameter`'s ABI compatibility.
type IntentParameterData = strict resource union {
    /// Set this if you already have an Entity reference at runtime.
    /// Entity.getTypes() will be used to set the constraints for this noun during
    /// resolution.
    1: entity_reference string:MAX;

    /// Set this if you have structured JSON data. Values typically are a JSON
    /// object with a "@type" attribute and other associated data.  TODO(thatguy):
    /// We need to decide if we want to keep this in place, or deprecate this
    /// eventually and move entirely to using Entity references.
    ///
    /// DEPRECATED: Use `entity_reference`.
    2: json fuchsia.mem.Buffer;

    /// Set this if you want to explicitly define this noun's allowed types. This
    /// is also useful in the cases where the noun has a 'direction' of type
    /// 'output', and you wish to set the allowable output types from the Module
    /// (see docs/modular/manifests/action_template.md for a definition of
    /// 'direction').
    ///
    /// Only one entry in `entity_type` must match the constraint specified by
    /// the Module for the constraint to be considered satisfied.
    3: entity_type vector<string:MAX>:MAX;
};
